linux中“写”功能的问题

时间:2010-06-02 09:29:00

标签: c++ c linux concurrency

我正在尝试在Linux下编写2个服务器/客户端程序,它们通过命名管道进行通信。问题是,有时当我尝试从服务器写入不再存在的管道(客户端已停止)时,我收到“资源暂时不可用”错误,服务器完全停止。

据我所知,这是由于在打开fifo chanel时使用O_NONBLOCK参数引起的,指示程序通常会等到它可以再次写入文件的位置,但有没有办法停止此行为,而不是如果出现问题,停止整个程序(写命令不应该返回-1,程序继续正常)?

另一个奇怪的事情是,只有在运行ide(eclipse)之外的程序时才会出现此错误。如果我在eclipse中运行这两个程序,则错误时write函数返回-1并且程序继续正常运行。

4 个答案:

答案 0 :(得分:6)

如果您希望write()在出错时返回-1(并将errno设置为EPIPE)而不是在写入结束时完全停止服务器您的管道未连接,您必须使用signal( SIGPIPE, SIG_IGN )忽略SIGPIPE信号。

答案 1 :(得分:2)

这种未定义行为的问题很奇怪,您可能在某处遇到内存问题或者您错过了测试。 (或者Eclipse做了一些特殊处理信号的事情?)

答案 2 :(得分:0)

引用第2节手册页写: “[errno =] EPIPE尝试写入未被任何进程读取的管道或FIFO,或只有一端打开的管道或FIFO(或由socket(3SOCKET)创建的文件描述符,使用类型) SOCK_STREAM不再连接到对等端点。。 SIGPIPE信号也将被发送到线程。除非采取特殊规定来捕获或忽略信号,否则进程将死亡。“[强调我的]

正如Platypus所说,你需要忽略SIGPIPE信号: signal(SIGPIPE, SIG_IGN)。您还可以在服务器中以不同的方式捕获信号并处理管道断开连接。

答案 3 :(得分:-2)

也许你可以将它包装成“try..catch”语句?