Unix 为什么父进程在读取管道操作时不阻塞?

Unix 为什么父进程在读取管道操作时不阻塞?,unix,pipe,fork,Unix,Pipe,Fork,我有以下代码: int main(int c, char** v) { int p[2], n; char s[10] = "ceva"; pipe(p); n = fork(); if(n == 0) { close(p[0]); printf("Before\n"); if(c > 2) execlp("grep","grep",v[1],v[2],NULL); strcpy(s, "after");

我有以下代码:

int main(int c, char** v) 
{
  int p[2], n;
  char s[10] = "ceva";
  pipe(p);
  n = fork();
  if(n == 0) 
  {
    close(p[0]);
    printf("Before\n");
    if(c > 2)
      execlp("grep","grep",v[1],v[2],NULL);
      strcpy(s, "after");   
    write(p[1], s, 6);
    close(p[1]);
    exit(0);
   } 
  close(p[1]);
  read(p[0], s, 6);
  close(p[0]);
  printf("%s\n", s);
  return 0;
}
当使用
/grep grep.c
运行代码时,我希望父进程在包含
读取(p[0],s,6)的行处阻塞因为子进程不在管道中写入任何内容,也不关闭写入端

你能告诉我哪里思维不正确吗


非常感谢。

孩子执行grep,它运行到完成并退出,关闭管道的写入端。由于父进程还关闭了管道的两端,因此读取返回。确定,因此exec进程是关闭管道的写入端。:)非常感谢。:)