我在手册页中为
pipe()
系统调用重新创建了示例,但我有点困惑为什么当父进程似乎在子进程之前完成时会打印 'Hello world'
消息:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
const int BSIZE = 100;
int fildes[2];
char buff[BSIZE];
pipe(fildes);
pid_t rc = fork();
if (rc == 0) {
printf("in child\n");
close(fildes[0]);
write(fildes[1], "Hello world\n", 13);
close(fildes[1]);
} else {
printf("in parent\n");
close(fildes[1]);
read(fildes[0], buff, BSIZE);
close(fildes[0]);
printf("%s", buff);
}
return 0;
}
输出如下所示:
in parent
in child
Hello world
从输出看来,父进程在子进程运行之前就完成了。如果是这样,
Hello world
如何打印?如果在子进程完成写入之前调用 read
,我希望在调用 buff
时 read
为空(或至少不完整)。
我删除了
close()
调用以查看 read()
是否正在等待另一端关闭,或者 pipe()
方法是否等待,但我得到了相同的结果。
这只是一个时间问题吗?它恰好以这种方式完成,我应该在父进程中添加“wait()”调用?
我在手册页中没有找到
pipe()
的答案,并且无法在谷歌上正确地表达它,所以我想我应该尝试在这里提问。
谢谢
在父进程中
read(fildes[0], buff, BSIZE)
正在阻塞读取。 您可以让自己相信这一点,例如,在子项 sleep(3)
之前添加 write(fildes[1], "Hello world\n", 13);
。 这有效地同步了子进程和父进程,所以printf("%s", buff);
。