我在使用这段代码时遇到了一些困难。 我需要从管道末端获取所有信息。 但是,我收到了段错误错误。
#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
文件描述符。这意味着您可以对它们使用 read
、write
或 close
,但不能使用 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
上使用 feof
和 fgetc
导致的 SEGFAULT,并确保正确关闭写入在读取文件内容之前先读取文件末尾以获得良好的文件结束条件。
关于c - 读取整个管道 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004132/