C 从一个父级写入多个子级?

C 从一个父级写入多个子级?,c,fork,pipe,C,Fork,Pipe,我正在学习管道和叉子。在这个例子中,我试着从父母那里给孩子们写同样的单词。以下是我写的一些练习代码(四个孩子): 如果我把write语句放在forking完成的循环中的else-If子句中,它就可以正常工作。然而,如果我试图在孩子们被创造出来之后再写作,它就不能很好地发挥作用 编辑:添加标记为“已编辑”的行后,程序按预期工作。这是正确的做法吗 并感谢您的投入。谢谢。当父管道退出时,管道关闭。然后,子级的读取将满足0字节的要求。(您应该检查读取的返回代码。)由于循环,每个子级也读取N次。第一个子项

我正在学习管道和叉子。在这个例子中,我试着从父母那里给孩子们写同样的单词。以下是我写的一些练习代码(四个孩子):

如果我把write语句放在forking完成的循环中的else-If子句中,它就可以正常工作。然而,如果我试图在孩子们被创造出来之后再写作,它就不能很好地发挥作用

编辑:添加标记为“已编辑”的行后,程序按预期工作。这是正确的做法吗


并感谢您的投入。谢谢。

当父管道退出时,管道关闭。然后,子级的读取将满足0字节的要求。(您应该检查读取的返回代码。)由于循环,每个子级也读取N次。第一个子项读取4次,第二个子项读取3次,以此类推。由于所有子项都在读取相同的管道,因此其中任何一个都可以满足读取要求。

当父项退出时,管道关闭。然后,子级的读取将满足0字节的要求。(您应该检查读取的返回代码。)由于循环,每个子级也读取N次。第一个孩子读了4遍,第二个孩子读了3遍,以此类推。因为所有的孩子都在读同一根管子,他们中的任何一个都能满足阅读要求。

你最后一点一直困扰着我。我不应该让write在一个循环中吗?通常的方法是在一个循环中分叉子对象。然后在循环结束后,用if(getpid()!=parentID)进行读取。这将导致每个孩子进行1次阅读。这意味着每个孩子都会得到一封信。啊,明白了!这很有效。但是,如果写操作也以类似的方式完成,那么由于循环中的if检查,您的写操作是正常的。只有父级将执行写入操作。最好是将if置于循环中。这使它更容易阅读。你的最后一点一直困扰着我。我不应该让write在一个循环中吗?通常的方法是在一个循环中分叉子对象。然后在循环结束后,用if(getpid()!=parentID)进行读取。这将导致每个孩子进行1次阅读。这意味着每个孩子都会得到一封信。啊,明白了!这很有效。但是,如果写操作也以类似的方式完成,那么由于循环中的if检查,您的写操作是正常的。只有父级将执行写入操作。最好是将if置于循环中。这使它更容易阅读。
#define MAXWORD 5

int main() {

    pid_t parentID, pid, fd[2];
    int i, j, k;
    int status = 0;
    char toWrite[5] = "abcd";

    pipe(fd);
    parentID = getpid();

    for (i = 0; i < 4; i++) {

        if (getpid() == parentID) {
            pid = fork();
        }

        if (pid < 0) {
            perror("fork");
            exit(1);

        } else if (pid == 0) {
            close(fd[1]);

            printf("Reading ...\n");            
            char buf[MAXWORD];
            read(fd[0], buf, MAXWORD);

            printf("CHILD : %d\tread : %s\n", getpid(), buf);

            exit(0); // edited

        }

    }

    for (k = 0; k < 4; k++) {
        if (getpid() == parentID) {
            close(fd[0]);
            printf("Writing ...\n");
            write(fd[1], toWrite, MAXWORD);

            wait(&status); // edited
        }
    }

    return 0;
}
Reading ...
Writing ...
CHILD : 1457    read : abcd
Writing ...
Reading ...
Reading ...
Writing ...
Writing ...
CHILD : 1458    read : abcd
CHILD : 1457    read : abcd
Reading ...
Reading ...
CHILD : 1458    read : abcd
Reading ...
Reading ...
Reading ...
CHILD : 1458    read : abcd
CHILD : 1459    read : 
Reading ...
CHILD : 1459    read : 
CHILD : 1460    read : 
CHILD : 1457    read : abcd
Reading ...
CHILD : 1457    read : abcd