请您解释一下,为什么即使在父级关闭其写入结束后,子进程也能够读取?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int fd[2];
char buffer[20];
pipe(fd);
if ( fork() == 0 ) //child
{
close(fd[0]); //As it is writing close the read end
strcpy(buffer, "Hello World");
write(fd[1], buffer, sizeof(buffer));
close(fd[1]);
}
else //parent
{
close(fd[1]); //As it is reading closing the write end
while(1)
{
read(fd[0], buffer, sizeof(buffer));
printf("Buffer:%s\n", buffer);
sleep(1);
}
close(fd[0]);
}
}
O / P:孩子不断打印:
Buffer:Hello World
为什么即使父母终止,孩子也能够收到?不应该read
获得EOF
吗?
答案 0 :(得分:0)
为什么即使父母终止,孩子也能够收到?不应该
read
获得EOF
吗?
此时,父进程基本上没有读任何内容(即:read()
正在返回0
)并在之前的read()
调用中反复打印。< / p>
您必须查看read()
系统调用返回的值。该值的类型为int
,基本上为:
-1
:错误,出了点问题。0
:还有其他内容无法阅读,即: EOF
(您正在寻找的内容)。read()
存储到buffer
的读取的字节数。您可以相应地重写父while
- 循环:
while(1) {
int count = read(fd[0], buffer, sizeof(buffer));
switch (count) {
case 0: // EOF
break;
case -1: // read() error
// ... error handling ...
break;
default: // fine
// count contains the number of bytes read
buffer[count] = '\0'; // NUL character, to indicate the end of string
printf("Buffer:%s\n", buffer);
sleep(1);
}
}