在尝试写入/读取之前是否可以检查管道是否损坏,所以我可以跳过它并继续执行该程序?
我利用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++;
}
这个问题与我的previous post有关,尽管我的问题背景不同。您可以在那里查看实际程序的代码。
答案 0 :(得分:5)
我的程序关闭,因为它被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.
}
答案 1 :(得分:4)
您可以设置一个信号处理程序来忽略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
答案 2 :(得分:3)
是的,在阅读和写作之前,您可以使用poll(2)之类的多路复用系统调用。这将告诉您哪些文件描述符是可读的(有read
的东西)和可写(可以是write
的主题),在一系列文件描述符中检查可读性或可写性。
(您可以使用较旧的select(2)多路复用系统调用,但我更喜欢poll
因为C10K problem)
请注意,其他一些线程可能会在您自己的线程之前执行某些操作。
你想要一些event loop。另请参阅this answer相关问题。