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/