当我编译并运行以下代码时:
#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
进行部分读取时,您最终又从最后一次读取中写出了额外的字节。