ASIO如何处理Sigpipe
How asio deal with SIGPIPE?
asio具有忽略signal_init.hpp中的sigpipe的代码,但是在io_service.hpp中有一个宏扭曲:
#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX)
|| defined(__osf__)
i在Ubuntu中编译发现宏未启用,因此尚未调用std::signal(Signal, SIG_IGN);
。
但是,当我通过ASIO写入封闭套接字时,它可以通过BOOST :: SYSTEM :: error_code报告Epipe错误。根据libc doc:
在这种情况下,请首先生成一个sigpipe信号;如果那个信号是被忽略或阻塞,或者如果其处理程序返回,则发送失败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#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- ASIO如何处理Sigpipe
- 如何在生成SIGPIPE错误的对象中处理它