我正在尝试在Linux下编写2个服务器/客户端程序,它们通过命名管道进行通信。问题是,有时当我尝试从服务器写入不再存在的管道(客户端已停止)时,我收到“资源暂时不可用”错误,服务器完全停止。
据我所知,这是由于在打开fifo chanel时使用O_NONBLOCK参数引起的,指示程序通常会等到它可以再次写入文件的位置,但有没有办法停止此行为,而不是如果出现问题,停止整个程序(写命令不应该返回-1,程序继续正常)?
另一个奇怪的事情是,只有在运行ide(eclipse)之外的程序时才会出现此错误。如果我在eclipse中运行这两个程序,则错误时write函数返回-1并且程序继续正常运行。
答案 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”语句?