分叉和管道:这个C程序是否包含竞争条件?

时间:2015-08-08 18:59:51

标签: c process pipe fork parent-child

我正在学习进程间通信,并遇到了下面的示例程序。

在子进程完成写入之前,我不明白阻止父进程尝试读取(作为程序底部的else条件的一部分)是什么

在子进程写入标准输出之前,什么(如果有的话)限制父进程尝试从标准输入读取?

int main(void)
{
    int     fd[2], nbytes;
    pid_t   childpid;
    char    string[] = "Hello, world!\n";
    char    readbuffer[80];

    pipe(fd);

    if((childpid = fork()) == -1)
    {
            perror("fork");
            exit(1);
    }

    if(childpid == 0)
    {
            /* Child process closes up input side of pipe */
            close(fd[0]);

            /* Send "string" through the output side of pipe */
            write(fd[1], string, (strlen(string)+1));
            exit(0);
    }
    else
    {
            /* Parent process closes up output side of pipe */
            close(fd[1]);

            /* Read in a string from the pipe */
            nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
            printf("Received string: %s", readbuffer);
    }

    return(0);
}

1 个答案:

答案 0 :(得分:1)

在孩子向管道写入任何内容之前,没有任何事情阻止父母开始read()调用,但父进程在孩子将数据写入管道之前不会获得任何数据(和写入将是原子的,因为它小于管道缓冲区的长度)。父级将挂起,等待一些数据到达管道或管道的每个写入端都要关闭。

请注意,如果读取后nbytes == 0,则printf()的输出不确定,因为readbuffer未初始化。