输出写入两次,并在管道和叉子之后重叠

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

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

#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只执行一次,其输出被馈送到管道的父级输入端。如何附加第二个部分日期字符串?

提前感谢!

c unix pipe fork dup
1个回答
0
投票

因为您将N传递给write而不是n,所以当read进行部分读取时,您最终又从最后一次读取中写出了额外的字节。

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