asio如何处理SIGPIPE?

时间:2017-09-07 06:26:38

标签: c++ boost-asio

Asio有代码忽略Signal_init.hpp中的SIGPIPE,但在io_service.hpp中有一个宏扭曲:

#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \
  || defined(__osf__)

我在Ubuntu中编译发现宏没有启用,因此std::signal(Signal, SIG_IGN);没有被调用。

但是,当我通过asio写入一个封闭的套接字时,它可以通过boost :: system :: error_code报告EPIPE错误,它在完整的处理程序中。根据{{​​3}}:

  

在这种情况下,send首先生成一个SIGPIPE信号;如果那个信号是   忽略或阻止,或者如果其处理程序返回,则发送失败   EPIPE。

如何使用SIGPIPE设置asio让进程忽略它? asio对此有何特别之处?

1 个答案:

答案 0 :(得分:0)

您可以简单地告诉您要忽略的操作系统SIGPIPE

Asio有代码在http://www.boost.org/doc/libs/1_65_1/boost/asio/detail/signal_init.hpp

执行此操作

奇怪的是(?)它只包含在老式的UNIX上:

#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
# include <boost/asio/detail/winsock_init.hpp>
#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \
  || defined(__osf__)
# include <boost/asio/detail/signal_init.hpp>
#endif

您可以自己完成:

#include <csignal>

// ...
std::signal(SIGPIPE, SIG_IGN);

或者你可以使用Asio信号集类:

#include <boost/asio.hpp>
#include <boost/asio/signal_set.hpp>
#include <iostream>

boost::asio::io_service svc;
boost::asio::signal_set ss(svc);

static void ignore_signal(boost::system::error_code ec, int /*signal*/) {
    if (!ec) ss.async_wait(ignore_signal);
    // 

std :: cout&lt;&lt; &#34; \ n&#34; &LT;&LT; ec.message()&lt;&lt; &#34; \ n&#34 ;;     }

int main() {
    ss.add(SIGPIPE);
    ss.add(SIGINT);
    ss.async_wait(ignore_signal);
    svc.run();
}