C管道写入/读取优先级

时间:2015-04-26 02:34:26

标签: c pipe fork

我正在尝试理解管道和在C中使用fork。下面是一个调用fork()的代码示例,然后:

  • 子进程:读取pipe并将内容打印到控制台。
  • 父进程:写入pipe“hello world”。

    int main(void)
    {
    pid_t pid;
    int mypipe[2];
    
    /* Create the pipe. */
    if (pipe(mypipe))
    {
        fprintf(stderr, "Pipe failed.\n");
        return EXIT_FAILURE;
    }
    /* Create the child process. */
    pid = fork();
    if (pid == (pid_t)0)
    {
        /* This is the child process.
        Close other end first. */
        close(mypipe[1]);
        read_from_pipe(mypipe[0]);//read pipe and print the result to console
        return EXIT_SUCCESS;
    }
    else if (pid < (pid_t)0)
    {
        /* The fork failed. */
        fprintf(stderr, "Fork failed.\n");
        return EXIT_FAILURE;
    }
    else
    {
        /* This is the parent process.
        Close other end first. */
        close(mypipe[0]);
        write_to_pipe(mypipe[1]);//write "hello world" to the pipe
        return EXIT_SUCCESS;
    }
    }
    

我的理解是我们使用pipes,它们被视为文件,以便子进程和父进程可以通信。 (这是正确的吗?)现在,由于管道正在从父项和子项中使用,孩子是否会读取空pipe?或者pipe是“Hello world”吗?为什么?我的猜测是它是随机的,因为子进程和父进程同时运行。这是真的 ?

1 个答案:

答案 0 :(得分:2)

根据man 7 pipe,&#34;如果进程尝试从空管道读取,则read(2)将阻塞,直到数据可用。&#34;。

因此,如果read发生在write之前,则会等到write完成。

相反,如果read发生在write之后,很明显它会返回消息。

至少有一个这样的情况必须是真的,因为,仍然根据man 7 pipe,&#34; POSIX.1-2001说写(2)s小于PIPE_BUF字节必须是原子&# 34;和PIPE_BUF通常足以容纳超过&#34; Hello World&#34;。

因此read将返回&#34; Hello world&#34;。