进程在写入管道之前读取数据

时间:2014-08-24 07:37:34

标签: unix fork ipc pipe

我正在尝试创建管道并使用fork()。但我对执行的顺序感到困惑。 在将任何内容写入管道之前,进程从管道读取数据。有时它运行正常。但有时候,在写作之前读取但仍能提供正确的输出。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
    int     fd[2], nbytes,ret;
    pid_t   childpid;
    char    string[] = "Hello, world!\n";
    char    readbuffer[80];

    pipe(fd);
    if(!fork())
    {
            close(fd[0]);
            printf("Writing...");
            write(fd[1], string, (strlen(string)+1));
            exit(0);
    }
    else{
            close(fd[1]);
            printf("Reading...");
            nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
            printf("Received string: %s", readbuffer);
            wait(NULL);

    }
return 0;
}

enter image description here

1 个答案:

答案 0 :(得分:0)

这是因为调度程序在子进程之前调度父进程,因此是 它会导致写入前的读操作。另一方面,输出可以是
正如预期的那样,有时调度程序会先安排孩子。

解: 1.你需要使用信号量之类的同步技术才能同步    父母和孩子。 2.或者你可以让父进程等到孩子完成。考虑一下    以下代码:

int child_status;  // declare this variable

/* add the following line to the else clause */
else
{
    close(fd[1]);
    wait(&child_status);
    // rest of your code
}

说明:   如果父进程在子进程之前被调度,则其执行将在执行时停止   它找到了等待(&amp; child_status)&#39;陈述并等待孩子完成任务   它的执行然后继续进行。