正如this答案中所解释的,我希望reader进程在writer进程关闭所有相关的文件描述符之后立即捕获EOF
。
但这并没有发生,这个程序最终陷入了一个无止境的循环。
父级等待其子级完成,子级等待EOF
发出关闭管道的信号。
为什么读卡器进程没有收到EOF
?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>
#define STRING_TO_SEND "Hello, world!\n"
int main() {
int fd[2], i = 0;
__pid_t pid;
char _char;
ssize_t nbytes;
pipe(fd);
pid = fork();
if (pid == -1) {
// Error
perror("Error forking!");
return EXIT_FAILURE;
} else if (pid == 0) {
// Child
close(fd[1]);
while ((nbytes = read(fd[0], &_char, 1)) != EOF) {
if (nbytes == 0)
continue;
putchar(_char);
}
close(fd[0]);
} else {
// Parent
close(fd[0]);
for(;;) {
_char = STRING_TO_SEND[i++];
write(fd[1], &_char, 1);
if (_char == '\0')
break;
}
close(fd[1]);
close(STDOUT_FILENO);
while (wait(NULL)>0) {}
}
return 0;
}
最佳答案
您只是误解了read()
的“文件结束”指示,这只意味着没有更多的内容可供read()
读取(在这种情况下,read()返回0)。但是read()
实际上并没有返回值EOF
。所以你的情况应该是:
while ((nbytes = read(fd[0], &_char, 1)) > 0) {
__pid_t
也是C库的内部类型。你不应该用这个,只要用pid_t
。有关详细信息,请参见read(2)的手册页。
关于c - C-当仅读取单个字符时如何检测管道中的EOF?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47356860/