正如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/

10-15 14:27