下面是程序:读取和写入到一个管道ç问题
int fd[2];
char buf1 [31];
int i;
char buf2;
pipe(fd);
if (fork() == 0) { // child
close(fd[1]); // close writing pipe
for(i = 0; i< 20; i++) {
read(fd[0], buf1, 30);
printf("%s\n", buf1);
}
close(fd[0]);
}
else { // parent
close(fd[0]); // close reading end
buf2 = 'a';
for (i = 0; i < 20; i++) {
write(fd[1], &buf2, sizeof(buf2));
}
close(fd[1]);
}
wait(NULL);
由于读取块,如果没有什么在那里,我们将首先写入管道。
我的问题是关于写函数。 for循环运行20次,每次我向管道写入a
。在20次迭代后,写入端的管道将包含aaaaaaaaaaaaaaaaaaaa
在孩子中,我读取所有20 a's
到buf1
,并打印出结果。
现在是空的,因为我们写了,读了我们写的东西?
因为还有一个for循环在这里,我们再次阅读,但是这一次,我想管是空的,所以那里有东西可读。所以我觉得以后的阅读20次迭代的最终输出只是 aaaaaaaaaaaaaaaaaaaa
但实际上它是这样的:
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
为什么?我们阅读后管道是不是空的?
在将数据读入缓冲区后,您不清除缓冲区,因此当您再次打印缓冲区时,您第一次读取的数据仍然存在。如果您检查函数调用的返回值,这将更清晰。 –
另请注意,在读取数据后,您无法追加空终止符;因此依靠一个人是不正确的。你幸运了。或者可能不是,因为如果你已经使用了'read()'的返回值(正确)来确定终止符应该去哪里,那么你就不会感到困惑。 –
@JohnBollinger这取决于;这不是一个MCVE,所以我们不知道'buf1'声明在哪里以及如何发生。如果它是静态的而不是在'main'中发生,或者如果它有一个未包含在这里的初始化,那么其余的字符都是0,它是安全的。如果所有这些都在'main'中,那么是的,这可能是一个问题。 –