gpt4 book ai didi

c++ - asio如何处理SIGPIPE?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:51 25 4
gpt4 key购买 nike

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 isignored or blocked, or if its handler returns, then send fails withEPIPE.

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com