【问题标题】:How to ignore empty pipes in CHILD process?如何忽略 CHILD 进程中的空管道?
【发布时间】:2015-10-14 10:52:52
【问题描述】:

我在我的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,以及如何处理(或忽略)信号的教程。
  • @JoachimPileborg 嗯……这听起来比我最初想象的要复杂。这是我唯一的选择吗?
  • 不,你可以使用signalfd() + poll()(或类似的)

标签: c pipe fdopen


【解决方案1】:

其实很简单,你只需要忽略SIGPIPE这个信号,一个函数调用就搞定了:

signal(SIGPIPE, SIG_IGN);

当管道为空时,不会引发SIGPIPE 信号,而是从管道读取将返回文件结束值(底层read 系统调用将返回0)。

【讨论】:

  • @Bababarghi 只需在应用程序初始化代码的早期添加该行。
  • 每个人都必须用勺子喂食吗?从字面上复制并粘贴他给你的代码行,把它扔到main() 的顶部,并且保持幸福的无知。否则,您可以阅读有关信号的更多信息并了解它们如何影响您的程序,以及如何控制它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2017-06-25
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多