我正在尝试创建管道并使用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;
}
答案 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;陈述并等待孩子完成任务 它的执行然后继续进行。