在尝试写入之前检查管道是否损坏?

标签 c linux pipe posix sigpipe

<分区>

是否可以在尝试写入/读取之前检查管道是否损坏,以便我可以跳过它并继续执行程序?

我正在利用 while 循环写入从父级到多个子级的管道通信。在循环过程中,几个 child 将关闭。当循环出现并尝试再次写入它们时,我的程序关闭,因为它被 SIGPIPE 杀死,因为管道已损坏。我知道管道坏了,我给 children 编程让他们关闭管道并退出(必要的)。我仍然想完成循环并继续执行程序。我希望它检查管道是否坏了,如果坏了就跳过它(没有错误输出),然后继续执行程序(其他 child 仍然需要写入)。

那么,这可能吗?用 c 编写的示例会很棒。

这是我要问的一个简单的伪代码表示:

int i = 0;

while(i != 5)
{
    if (mypipe[WRITE] is BROKEN)
        //Do Nothing ---Basically Skip

    else if (some condition)
        write(mypipe[WRITE]);

    i++;
}

此问题与 previous post 有关我的,尽管我的问题的背景不同。您可以在那里查看实际程序的代码。

最佳答案

my program shuts down because it is killed by SIGPIPE

如果安装忽略 SIGPIPE 的信号处理程序,则可以更改该行为,这样对管道的 write() 调用将返回错误而不是终止程序:

  signal(SIGPIPE, SIG_IGN);

然后你简单的检查一下

ssize_t rc;
rc = write(...);
if (rc == -1) {
    if (errno == EPIPE) {
         //it's broken
    }
 //some other error occured.
}

关于在尝试写入之前检查管道是否损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26362449/

相关文章:

python - 将 python for 循环的一次迭代的输出通过管道传输到另一个脚本

c - 错误 : unknown type name struct

c - 预先计算的变量定义与通过计算初始化

linux AWK 命令与操作

linux - 如何使用 grep 命令找到不包含字母 "e"的 8 个字母单词的数量?

linux - 如何查看linux系统是否使用了较大的磁盘空间?

javascript - 如何使用 Node.js createReadStream 和 createWriteStream 写入多个文件

c - "static const"vs "#define"vs "enum"

c - 有没有一种好方法可以改变用 fork() 创建的子进程的执行顺序?

bash - Bash 中管道如何工作的简单解释是什么?