[英]C - How to detect EOF in pipe when reading only single char?
正如此答案中所解釋的,我希望讀取器進程在寫入器進程關閉所有相關文件描述符之后立即捕獲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()
在這種情況下,read()返回0)。 但是read()
實際上並沒有返回值 EOF
。 因此,您的條件應為:
while ((nbytes = read(fd[0], &_char, 1)) > 0) {
__pid_t
也是C庫的內部類型。 您不應該使用它; 只需使用pid_t
。
有關詳細信息,請參見read(2)的手冊頁。
EOF
是一個通常定義為-1的常量, stdio
(原始系統調用周圍的C庫緩沖層)用來通過getchar()
類的函數來表示文件結束,該函數將返回的字符與文件結束信號進行合並。
只需返回0
即可read
文件結尾的信號。 請注意,如果發生錯誤,它也可以返回-1(例如,如果在讀取任何內容之前被信號處理程序中斷讀取,則可以獲取EINTR
)。
因此,您想要的是這樣的:
while ((nbytes = read(fd[0], &_char, 1)) > 0){ /*...*/ }
if (0>nread) { /*report error (or maybe repeat if it's EINTR)*/ }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.