c++ - asio如何处理SIGPIPE?

标签 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 错误。根据libc doc :

In this case, send generates a SIGPIPE signal first; if that signal is ignored or blocked, or if its handler returns, then send fails with 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();
}

关于c++ - asio如何处理SIGPIPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46089264/

相关文章:

c++ - 不处理 asio 异步操作

C++:为什么要编译? (将 this-Reference 传递给基类)

c++ - C++中的重载赋值运算符

c++ - 如何压缩多个升压预处理器序列?

c++ - 为什么 boost::asio::io_service 不能用 std::bind 编译?

c++ - boost .asio : multi ports application-layer protocol

C++网络多应用协议(protocol)

c++ - 从套接字接收后出现 SEGFAULT

c++ - 编译命令成功,链接错误 undefined reference 符号 '_ZNSt3__15mutex4lockEv'

c++ - Boost Asio SSL 第二次以后无法接收数据(第一次正常)