输出写入两次并在 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
进行部分读取时,您最终会从最后再读一遍。
当我编译并运行以下代码时:
#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
进行部分读取时,您最终会从最后再读一遍。