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医生
在这种情况下,send首先生成一个SIGPIPE信号;如果该信号被忽略或阻塞,或者它的处理程序返回,那么send将在EPIPE中失败。
asio如何设置SIGPIPE让进程忽略它?asio在这个问题上有什么特别之处吗?
发布于 2017-09-07 13:07:42
您可以简单地告诉您希望忽略SIGPIPE的操作系统。
Asio有代码可以在这里执行,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();
}https://stackoverflow.com/questions/46089264
复制相似问题