我正在使用管道在Gnu/Linux上两个进程之间进行通信。接收端关闭管道,而发送端仍在尝试发送数据。以下是一些模拟该情况的代码。
#include <unistd.h>
#include <boost/asio.hpp>
int main()
{
int pipe_fds[2];
if( ::pipe(pipe_fds) != 0 ) return 1;
// close the receiving end
::close( pipe_fds[0] );
boost::asio::io_service io;
boost::asio::posix::stream_descriptor sd( io, pipe_fds[1] );
boost::system::error_code ec;
sd.write_some( boost::asio::buffer("blah"), ec );
return 0;
}
当我运行它时,我得到了一个SIGPIPE错误; 这是一个经典情况,我知道。然而,我发现boost :: asio :: error :: basic_errors有一个broken_pipe值。我期望在不引发信号的情况下将其返回给error_code。
是否可以在不为我的进程创建SIGPIPE处理程序的情况下完成此操作?例如,是否有一个我忽略了的配置选项可以用于boost ::asio?也许是一些能够在实现中启用MSG_NOSIGNAL的东西?