首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asio如何处理SIGPIPE?

asio如何处理SIGPIPE?
EN

Stack Overflow用户
提问于 2017-09-07 06:26:38
回答 1查看 525关注 0票数 2

Asio有代码可以忽略Signal_init.hpp中的SIGPIPE,但是在io_service.hpp中有一个宏扭曲:

代码语言:javascript
复制
#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在这个问题上有什么特别之处吗?

EN

回答 1

Stack Overflow用户

发布于 2017-09-07 13:07:42

您可以简单地告诉您希望忽略SIGPIPE的操作系统。

Asio有代码可以在这里执行,init.hpp

奇怪的是(?)它只包含在老式的UNIX中:

代码语言:javascript
复制
#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

你可以自己做:

代码语言:javascript
复制
#include <csignal>

// ...
std::signal(SIGPIPE, SIG_IGN);

或者可以使用Asio信号集类:

代码语言:javascript
复制
#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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46089264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档