如何在CHILD进程中忽略空管道



我在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)。

相关内容

  • 没有找到相关文章

最新更新