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

C 在尝试写入之前,检查是否有损坏的管道?,c,linux,pipe,posix,sigpipe,C,Linux,Pipe,Posix,Sigpipe,在尝试写入/读取管道之前,是否可以检查管道是否损坏,这样我就可以跳过它并继续程序 我正在使用while循环来写入从父级到多个子级的通信管道。在循环的过程中,几个孩子将闭合。当循环出现并再次尝试写入它们时,我的程序关闭,因为它被SIGPIPE杀死,因为管道被破坏了。我知道管子坏了,我让孩子们关上管子,然后退出(必要的)。我仍然想完成循环并继续程序。我希望它检查管道是否损坏,如果损坏跳过它(没有错误输出),然后继续执行程序(其他孩子仍然需要被写入) 那么,有可能吗?用c语言做一个例子就好了 这里有一

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

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

那么,有可能吗?用c语言做一个例子就好了

这里有一个简单的伪代码表示我的问题:

int i = 0;

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

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

    i++;
}

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

是的,您可以在读写之前使用多路复用系统调用。这将告诉您在一系列文件描述符中,哪些文件描述符是可读的(具有要读的内容)和可写的(可以是写的主题),以检查可读性或可写性

(您可以使用较旧的多路复用系统调用,但我更喜欢
poll
,因为

请注意,其他线程可能会在您自己的线程之前执行某些操作

你想要一些。另请参见相关问题

我的程序关闭了,因为它被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.
}

您可以将信号处理程序设置为忽略
SIGPIPE
,然后写入缓冲区并检查错误代码:

/* initialization */
signal(SIGPIPE, SIG_IGN);
...

/* try writing to pipe and detect broken pipe */
ssize_t written = write(mypipe[WRITE], buf, size);
if (written == -1 && errno == EPIPE)
  ... remove pipe from the list and continue processing

我认为pthreads中有一些线程的使用方法可能会有所帮助。作为一种解决方法,孩子们可以通知家长(通过管道?)他们已经完成了,家长有责任关闭管道。这几乎解决了问题。使用以下tweek:
if(信号(SIGPIPE,SIG_IGN)==SIG_ERR){//doo Nothing}
现在我的代码通过了断开的管道。谢谢