我在child
进程中使用名为read_from_pipe
的子程序,如下所示读取管道中的内容并显示它:
void read_from_pipe(int fileDescriptr)
{
FILE *stream;
int c;
if (fileDesc_Is_Valid(fileDescriptr) == TRUE)
{
stream = fdopen(fileDescriptr, "r");
while ((c = fgetc(stream)) != EOF)
putchar(c);
fclose(stream);
}
else
perror("Reading from pipe failed -->");
}
fileDesc_Is_Valid
是另一个检查文件描述符是否存在的子程序。
问题在于,因为我在parent
中使用了waitpid(pid, &status, 0);
语句来等待child
完成其任务,所以当管道实际上为空时,编译器会在while
循环的第一次冷运行中卡住。我怎么能AND
另一个条件在我的while
让编译器简单地忽略空管道?
这实际上非常简单,您只需要忽略SIGPIPE
信号,并且通过单个函数调用完成:
signal(SIGPIPE, SIG_IGN);
当管道为空时,不是引发SIGPIPE
信号,而是从管道中读取将返回一个文件结束值(底层read
系统调用将返回0
)。