父进程在子进程之前完成,但仍然从管道打印出数据

问题描述 投票:0回答:1

我在手册页中为

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()
的答案,并且无法在谷歌上正确地表达它,所以我想我应该尝试在这里提问。

谢谢

c process pipe fork
1个回答
0
投票

在父进程中

read(fildes[0], buff, BSIZE)
正在阻塞读取。 您可以让自己相信这一点,例如,在子项
sleep(3)
之前添加
write(fildes[1], "Hello world\n", 13);
。 这有效地同步了子进程和父进程,所以
printf("%s", buff);

© www.soinside.com 2019 - 2024. All rights reserved.