我在此代码上遇到了一些困难。我需要在末端从管道中获取所有信息。但是,我遇到了一个segfault错误。
#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 : %cn", temp);
}
return 0;
}
如果您对如何解决此问题有一个想法,请解释。
pipe
函数返回是 int
文件描述符,而不是FILE
。这意味着您可以在它们上使用 read
, write
或 close
此外, while(!feof(file))
几乎是(几乎(是错误的,因为之后的标志是设置未成功的读取已到达文件的末尾。
这不是全部。当写入端上的所有描述符都关闭时,您只会在管道的读取端上获得EOF。因此,您必须关闭或齐平stdout
,以确保所有字符已写入管道,如果您没有关闭stdout,请关闭文件描述符1,并关闭tube[1]
,它仍然是管子的写入端的文件描述符。p>因此,您可以用:
close(tube[1]);
fclose(stdout);
while (1) {
char temp;
if (read(tube[0], &temp, 1) < 1) break;
fprintf(stderr, "chaine : %cn", temp);
}
它修复了通过使用feof
和fgetc
在不是FILE
的东西上使用CC_12和CC_13引起的SEGFAULT,并在阅读其内容之前确保文件的写入末端的正确关闭以获得文件状态。
,但是,我遇到了一个segfault错误。?这意味着您没有正确阅读编译器警告。当您做feof(tube[0])
时,它说feof()
期望FILE*
,但您提供了int
(tube[0]
是Inetger(类型。
/usr/include/stdio.h:828:12:注意:预期'struct file *'但是 参数是类型的" int"
因此,第一件事是始终阅读编译器警告&amp;用-Wall
标志编译代码。
此fgetc(tube[0]);
不是从file descriptor
读取数据的方法,而是使用read()
呼叫来读取来自文件描述符而非fgetc()
的数据。fgetc()
如果您已经使用fopen()
打开文件。
也
dup2(tube[1],1); /* this is not expected one which you want*/
使用这样的使用
dup2(1,tube[1]);/*stdout get duplicated with tube[1] i.e whatever you
write on stdout will be written into write end of pipe*/
这是一个简单的示例。
char temp[100];
int ret = 0;
ret = read(tube[0],temp,sizeof(temp));/*reading from pipe*/
if(ret == -1) {
perror("read");
return 0;
}
else {
temp[ret] = ' ';/*read returns no of items read, so put null
at last otherwise you may get some junk data */
printf("%s",temp);
}
阅读man 2 read
&amp;man 2 dup2
知道这些系统调用的工作方式。
您正在使用一个返回单个字符(FGETC(的函数,然后将该值视为printf调用中字符串的指针。您还将该角色存储为指针指向角色而不是实际字符的地址,因此,当Printf读取字符串时,它正在读取某些不拥有的低内存。FGETC返回角色本身,您需要一个char变量,而不是char*。
尝试:
while (!feof(tube[0])) {
char temp = fgetc(tube[0]);
printf("chaine : %cn", temp);
}