ACE reactor模式里忽略SIGPIPE

问题描述

ACE reactor模式里忽略SIGPIPE

I haved googled ,and find 3 methords to ignore SIGPIPE, but they are not work, the 3 methords to ignore SIGPIPE in ACE :

1: ignore SIGPIPE directly in send_function, but it's not work:

int send_function(){
// Ensure an error, not a signal, on broken pipe.
ACE_Sig_Action no_sigpipe ((ACE_SignalHandler) SIG_IGN);
ACE_Sig_Action original_action;
no_sigpipe.register_action (SIGPIPE, &original_action);

.................
peer().send_n(buf, buf_len);
.................

no_sigpipe.restore_action (SIGPIPE, original_action);
}
2: ignore SIGPIPE in the begin of main function, but it's not work:

int main() {
// Ignore SIGPIPE so that each can handle this on its own.
ACE_Sig_Action sig ((ACE_SignalHandler) SIG_IGN, SIGPIPE);
ACE_UNUSED_ARG (sig);

......
}
3:Try to fetch SIGPIPE signal with ACE handler_signal(), but it's not work:

ACE_Sig_Set sig_set;
sig_set.sig_add(SIGINT);
sig_set.sig_add(SIGQUIT);
sig_set.sig_add(SIGSEGV);
sig_set.sig_add(SIGPIPE);

if (ACE_Reactor::instance()->register_handler(sig_set, this) == -1)
ACE_ERROR_RETURN((LM_ERROR,
ACE_TEXT("%p
"),
ACE_TEXT("register_handler")),
-1);

  ...

handle_signal function:
int XXX::handle_signal(int signum, siginfo_t *,ucontext_t *)
{
if( SIGPIPE== signum ){
ACE_Stack_Trace st;
ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%D) stack :
%s
"), st.c_str()));
ACE_Sig_Set sig_set;
sig_set.sig_add(SIGSEGV);
ACE_Reactor::instance()->remove_handler(sig_set);
}
ACE_Reactor::end_event_loop();

ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%D) end event loop
")));
return 0;
}
the SIGPIPE can't be fetched in handle_signal().

I have try this 3 methords, but they are not work.

can only one help me?

请各位大侠帮帮忙,小弟现在想把ACE中发生的SIGPIPE信号忽略处理,百度了也说这三种方法不可行,请高手指点,先谢谢了!
http://stackoverflow.com/questions/27894269/ace-set-ignore-sigpipe-is-not-work

解决方案

http://blog.csdn.net/iw1210/article/details/36204429

解决方案二:

ACE学习(八)Reactor模式
----------------------

时间: 2024-09-08 05:42:29

ACE reactor模式里忽略SIGPIPE的相关文章

Netty源码解读(四)Netty与Reactor模式

一:Netty.NIO.多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手.过年期间@李林锋hw发布了一个Netty5.0架构剖析和源码解读 ,看完也是收获不少.前面的文章我们分析了Netty的结构,这次咱们来分析最错综复杂的一部分-Netty中的多线程以及NIO的应用. 理清NIO与Netty的关系之前,我们必须先要来看看Reactor模式.Netty是一个典型的多线程的Reactor模式的使用,理解了这部分,在宏观上理解Netty的NIO及多线程部分就不会有什么

ACE反应器(Reactor)模式的深入分析_C 语言

反应器(Reactor):用于事件多路分离和分派的体系结构模式通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞.所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止.而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待. 在前面的章节中提到的Tcp通信的例子中,就是采用的阻塞式的工作方式:当接收tcp数据时,如果远端没有数据可以读,则会一直阻塞

Reactor模式详解

前记 第一次听到Reactor模式是三年前的某个晚上,一个室友突然跑过来问我什么是Reactor模式?我上网查了一下,很多人都是给出NIO中的 Selector的例子,而且就是NIO里Selector多路复用模型,只是给它起了一个比较fancy的名字而已,虽然它引入了EventLoop概 念,这对我来说是新的概念,但是代码实现却是一样的,因而我并没有很在意这个模式.然而最近开始读Netty源码,而Reactor模式是很多介绍Netty的文章中被大肆宣传的模式,因而我再次问自己,什么是Reacto

muduo库源码剖析(一) reactor模式

一. Reactor模式简介 Reactor释义"反应堆",是一种事件驱动机制.和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为"回调函数". 二. moduo库Reactor模式的实现 muduo主要通过3个类来实现Reactor模式:EventLoop,Chann

soap-基于SOAP和REST的ACE编程模式的访问

问题描述 基于SOAP和REST的ACE编程模式的访问 什么是对于基于SOAP和REST的Authority-Container-Entity (ACE) 编程模式的访问?

ACE Reactor的Echo Server

相对完整的修改版本   1 /************************************************************************   2 * @file: echo.cpp                                                      3 * @author: dennis  4 * @revise: dennis <killme2008@gmail.com> http://www.blogjava.ne

网站盈利模式里的关系图谱

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站的盈利模式一直是一个被不停讨论的话题,对于很多创业型的为了招揽风险投资的网站来说,盈利模式更是非常重要的一点.所谓网站的盈利模式,说白了就是说这个网站是怎么赚钱的,从谁手里收钱的,能收多少钱.之前写过不少篇文章都有提到过个人认为的网站盈利模式的几个大类,本文不再赘述.最近脑子里突然冒出来一个想法,那就是在网站的盈利模式中涉及到的关系问题,

MVVM模式里TextBox绑定GotFocus事件和Text值后无法获取到Text值

问题描述 图怎么传不上来?就是要实现一个查找框,平时用灰色在输入框里显示"请输入姓名查找",当获取焦点后,这句提示就消失掉的那种功能,具体代码如下:Xaml:<TextBoxName="SerTextBox"Margin="0"TextWrapping="Wrap"Text="{BindingFilter}"Grid.ColumnSpan="2"Foreground="#

ACE框架reactor同步问题求助?

问题描述 ACE框架reactor同步问题求助? //小弟在ACE reactor框架中开启一个定时器和一个接受器,代码如下:class Timer: public ACE_Event_Handler { virtual int handle_timeout (const ACE_Time_Value &current_timeconst void *act = 0);} int ACE_TMAIN(int argcACE_TCHAR *argv[]){ Sgl_Timer::instance(