首页 > 解决方案 > 内部由管道连接的具有父/子进程的迭代器未正确递增

问题描述

非常简单的大学代码(操作系统类),使父进程从字符串中读取,然后子进程写入字符串,同时使用管道。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>


int main(int argc, char* argv[])
{
    int nDadosTx, nDadosRx;
    int size = 2;
    const char textoTX[] = "roger roger!";
    char textoRX[sizeof(textoTX)];
    int fd[size][2];
    
    int i = 0;
    while (i < size)
    {

        if (pipe(fd[i]) < 0)
        {
            puts("Erro ao abrir os pipes.\n");
            exit(-1);
        }
            if (fork() == 0)
            {
        
                    close(fd[i][0]); 
                    nDadosTx = write(fd[i][1], textoTX, strlen(textoTX)+1);
        
                    if (nDadosTx != strlen(textoTX)+1)
                    { 
                        printf("Tamanhos da mensagem incompativeis: %d, %d.\n", nDadosTx, strlen(textoTX)+1);
                        exit(1);
                    }
        
                    printf("%d dados escritos\n", nDadosTx);
            
                    printf("Droid %d a postos.\n------\n", i);

            }
            else
            {
                close(fd[i][1]);
                nDadosRx = read(fd[i][0], textoRX, sizeof(textoRX));
                printf("%d dados lidos: %s\n", nDadosRx, textoRX);
            }

        waitpid(-1, NULL, 0);
        i++;

    }
    
    /*for (int i = 0;  i < 6; i++)
    {
        close (fd[0]);
        close (fd[1]);
    }*/
    
    return 0;
}

如果程序只执行 1 次,但添加迭代:
2 次迭代:
i = 0
正常打印
i = 1
正常打印
i = 1
正常打印
(是的,再次)

3 次迭代:
i = 0
正常打印
i = 1
正常打印
i = 2
正常打印
i = 2
正常打印
i = 1
正常打印
i = 2
正常打印
i = 2
正常打印

这是怎么回事?
GCC 10.1.0

标签: coperating-systempipefork

解决方案


“一个问题是子进程也在运行只有父进程才能运行的代码——例如,子进程也调用 waitpid,然后在下一次迭代中分叉。子代码路径应该在此之前退出或返回。——@kaylum 5 分钟前"

#include <sys/types.h>

退出(EXIT_SUCCESS);到底孩子做到了。


推荐阅读