1

我正在学习管道和叉子。在这种情况下,我试图将同一个词从父级写到其子级。这是我写的一些练习代码(四个孩子):

#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

如果我将写语句放在完成分叉的循环中的 else if 子句中,则它可以正常工作。但是,如果我在创建孩子之后尝试编写它,则效果不佳。

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

并赞赏输入。谢谢你。

4

1 回答 1

1

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

于 2013-03-19T01:49:33.067 回答