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对此有何特别之处?
答案 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();
}