ASIO如何处理Sigpipe

How asio deal with SIGPIPE?

本文关键字:处理 Sigpipe 何处理 ASIO      更新时间:2023-10-16

asio具有忽略signal_init.hpp中的sigpipe的代码,但是在io_service.hpp中有一个宏扭曲:

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

i在Ubuntu中编译发现宏未启用,因此尚未调用std::signal(Signal, SIG_IGN);

但是,当我通过ASIO写入封闭套接字时,它可以通过BOOST :: SYSTEM :: error_code报告Epipe错误。根据libc doc:

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

ASIO如何与Sigpipe设置,让进程忽略它?Asio对此做一些特别的?

您可以简单地告诉您要忽略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 << "n" << ec.message() << "n";
}
int main() {
    ss.add(SIGPIPE);
    ss.add(SIGINT);
    ss.async_wait(ignore_signal);
    svc.run();
}