簡體   English   中英

C-當僅讀取單個字符時如何檢測管道中的EOF?

[英]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)*/ }

聯機幫助頁( read(2) )或用於讀取文檔的POSIX規范

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM