c - 读取整个管道 - c

标签 c pipe dup2 feof

我在使用这段代码时遇到了一些困难。 我需要从管道末端获取所有信息。 但是,我收到了段错误错误。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(void){

    int tube[2];

    if(pipe(tube) == -1){
        perror("Erreur");
        exit(1);
    }

    dup2(tube[1],1);

    printf("Few lines \n");
    printf("of an undefined size. \n");

    while (!feof(tube[0])) {
        char temp = fgetc(tube[0]);
        printf("chaine : %c\n", temp);
    }

    return 0;
}

如果您知道我如何处理这个问题,请解释一下。

最佳答案

pipe 函数返回的是一对int 文件描述符,而不是FILE 文件描述符。这意味着您可以对它们使用 readwriteclose,但不能使用 fgetc feof.

此外,while(!feof(file))(几乎)总是 wrong ,因为该标志是在不成功的读取到达文件末尾之后设置的。

这还不是全部。只有当写入端的所有描述符都关闭时,才会在管道的读取端得到 EOF。因此必须关闭或刷新stdout以确保所有字符都已写入管道,如果没有关闭stdout则关闭文件描述符1,并关闭tube[1] 它仍然是管写端的文件描述符。

因此您可以将 while 循环替换为:

close(tube[1]);
fclose(stdout);

while (1) {
    char temp;
    if (read(tube[0], &temp, 1) < 1) break;
    fprintf(stderr, "chaine : %c\n", temp);
}

它修复了在非 FILE 上使用 feoffgetc 导致的 SEGFAULT,并确保正确关闭写入在读取文件内容之前先读取文件末尾以获得良好的文件结束条件。

关于c - 读取整个管道 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004132/

相关文章:

c - 将 bash 命令 echo 和 bc 管道化到 C 程序中

c - strtok 覆盖我的变量

c - 如何初始化一个只有 NULL 指针的字符串数组?

使用gcc编译c程序时出现类型冲突错误

Linux 管道中的 Python readline

c - 关闭原始文件描述符后,重复的描述 rune 件会被关闭吗?

c - 有什么比用于彩票调度程序的 LCG 更好的(伪)随机数生成器?

pipe - 因素 sudo 跨管道

python - 从 python 代码调用 ELF

c - 是否可以使用 dup2 将 stdout 重定向两次?