2010-05-04 40 views
4

在写入C之前是否有一种简单的方法检查管道是否已关闭?我有一个孩子和父母的过程,父母有一个管道写给孩子。但是,如果孩子关闭管道并且父母试图阅读 - 我收到了一个管道故障错误。在写入封闭管道之前进行C检查

那么如何检查以确保我可以写入管道,因此如果不能,我可以将其作为错误处理?谢谢!

回答

7

一个简单的方法来检查是做一个0字节写入(2)到管道并检查返回。如果您正在捕获SIGPIPE或检查EPIPE,则会出现错误。但是,就像您继续前进并进行真正的写入,检查错误返回一样。因此,只需在信号处理程序(SIGPIPE)中执行写入和处理错误,或者如果信号被忽略,则通过检查写入错误返回来执行错误。

+0

这似乎是最简单的方法,谢谢! – Gary 2010-05-04 13:04:14

3

只是试图编写和处理错误?与写入文件或数据库的方式相同。我看不出有什么价值的成语:

check if *this* is going to work 
do *this* 

您只需引入一个更小,更难以在测试中捕捉,机会之窗:

check if *this* is going to work 
    child thinks "Ha, fooled you, I'm off now!" 
do *this*, which now fails! 
+0

没有这实际上有合法的用途。考虑一个父进程检查它的子进程是否因为它传递给它的套接字被对等关闭而死掉。此外,你所说的成语叫做“在你跳跃前注视”。 – 2012-06-12 15:49:13

+0

@matt,首先添加的支票有什么价值?即使孩子最初是健康的,写入仍然可能失败。父母可以从检查中推断出一些额外的信息。是否保证,如果初次检查失​​败,那是因为你说的原因,而不是因为其他原因导致孩子死亡。我的想法是,我们真正知道的是,当我们想要孩子时,孩子不在那里,因此我们通过写作或不写作来检测。 – djna 2012-06-12 20:46:40