输出写入两次并在 pipe 和 fork 之后重叠

Output written twice and overlapping after pipe and fork

当我编译并运行以下代码时:

#include <stdlib.h>
#include <unistd.h>

#define N 20

int main() {
  int fd[2], p, n;
  char c[N];

  pipe(fd);
  p = fork();

  if (p == 0) {
    dup2(fd[1], 1);
    execlp("date" , "date" , NULL);
    write(fd[1], "Bye", 3);
  }
  else {
    close(fd [1]);
    while((n=read(fd[0], &c, N)) > 0) write(1, &c, N);
  }
  exit (0);
}

输出如下:

Wed May 27 15:28:21 CEST 2020
 15:28:21 

看起来 date 的输出被写入了两次并且重叠了,但我不明白为什么以及如何。我看到输出有两个文件描述符(通过 dup2),但 date 只执行一次,它的输出被馈送到父级管道的输入端。如何附加第二个部分日期字符串?

提前致谢!

因为您将 N 传递给 write 而不是 n,所以当 read 进行部分读取时,您最终会从最后再读一遍。