信号处理方法的问题

这周有位新同事请我帮忙看一个关于信号处理的问题,程序希望在收到一个信号后退出,而他在信号处理方法里却做了许多事,包括释放一些全局内存等。

这样问题就产生了,程序不定时的就挂死了,用gdb一看,所有的线程都挂在了pthread_once方法里,而似乎每个线程都在处理信号,其中产生问题的线程堆栈如下:

Thread 1 (Thread 0x7f41252f3720 (LWP 31542)):
#0 0x000000339860cb1b in pthread_once () from /lib64/libpthread.so.0
#1 0x00000033982fd6f4 in backtrace () from /lib64/libc.so.6
#2 0x000000339826fa4b in __libc_message () from /lib64/libc.so.6
#3 0x0000003398275366 in malloc_printerr () from /lib64/libc.so.6
#4 0x0000003398278de4 in _int_malloc () from /lib64/libc.so.6
#5 0x0000003398279b91 in malloc () from /lib64/libc.so.6
#6 0x00007f41253b40bd in operator new(unsigned long) () from /usr/lib64/libstdc++.so.6
#7 0x00007f41253b41d9 in operator new[](unsigned long) () from /usr/lib64/libstdc++.so.6
---Type <return> to continue, or q <return> to quit---
#8 0x000000000045f86a in log4cpp::StringUtil::vform(char const*, __va_list_tag*) ()
#9 0x000000000044eb69 in log4cpp::Category::_logUnconditionally(int, char const*, __va_list_tag*) ()
#10 0x000000000044f4af in log4cpp::Category::warn(char const*, ...) ()
#11 0x00000000004431a1 in singalHandler(int) ()
#12 <signal handler called>
#13 0x000000339860cb19 in pthread_once () from /lib64/libpthread.so.0
#14 0x00000033982fd6f4 in backtrace () from /lib64/libc.so.6
#15 0x000000339826fa4b in __libc_message () from /lib64/libc.so.6
#16 0x0000003398275366 in malloc_printerr () from /lib64/libc.so.6
#17 0x0000003398278de4 in _int_malloc () from /lib64/libc.so

问题在哪里呢?似乎所有开源代码里,都少有人在信号处理方法里写大量代码的,这是为什么呢?

原因在于,信号是可能在任意时刻打断你线程的正在执行代码,信号处理方法插入进去执行时,就可能造成有些函数被反复重入。例如上面这个例子中,thead1正在new一个对象,执行malloc分配内存的过程中,突然被信号打断,而信号处理方法里居然又有malloc过程,而malloc是不能反复重入的!于是导致挂死。

另一个问题的,子进程会继承父进程的很多资源,其中就包括信号,他的程序处理信号后,才pthread_create许多工作线程,而且,没有屏蔽信号,所以,所有的线程都在处理那个信号处理方法,所有线程都挂死了。

解决方法有很多种,通常是在信号处理方法里只做少量工作,通知其他线程自我回收资源。

对于多线程程序来说,只弄一个线程使用阻塞式信号处理方法,专职的处理信号,这样更符合多线程的设计精神。例如,在派生子线程前,用pthread_sigmask来设置信号不会打断子线程的运行,而在主线程里,使用阻塞的sigwait方法来同步处理信号,在这里可以处理一些复杂的操作,不用担心“重入”问题。

信号处理方法的问题,布布扣,bubuko.com

时间: 2024-08-06 01:50:12

信号处理方法的问题的相关文章

Inout双向端口信号处理方法

Verilog中inout端口的使用方法 (本文中所有Verilog描述仅为展示inout端口的用法,实际描述则需要更丰富的功能描述) Inout端口的使用 在芯片中为了管脚复用,很多管脚都是双向的,既可以输入也可以输出.在Verilog中即为inout型端口.Inout端口的实现是使用三态门,如FPGA中的管脚复用部分: 三态门的第三个状态是高阻态Z.在实际电路中高阻态意味着响应的管脚悬空.断开.当三态门的控制信号为真时,三态门导通:控制信号为假时,三态门的输出端是高阻态. Verilog中的

转载--理解数字信号处理的三把钥匙

原址 在数字信号处理大厦中,有许许多多的小房间,有的门上写着"DFT",有的门上写着"滤波",有的门上写着"卷积",有的门上写着"相关",等等.每一个房间都藏着知识的秘密,每一个房间都要用属于自己的钥匙才能打开.但就整体上来说,理解数字信号处理有三把"万能"的钥匙:时域与频域的相互切换.向量和MATLAB软件.充分应用这三把钥匙,能为深入理解数字信号处理提供有力的帮助. 1.时域与频域的相互切换 深入理解数

linux 信号处理

前言 Linux中的信号是向进程异步发送的事件通知,通知进程有事件(硬件异常.程序执行异常.外部发出信号)发生.当信号产生时,内核向进程发送信号(在进程所在的进程表项的信号域设置对应于该信号的位).内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时,当一个进程在内核态运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理,进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号.内核为每个进程维护一个(未处理)的信号队列,信号产生后首先被放入到未决队列中,如果进程

视频图像去模糊常用处理方法

视频图像去模糊常用处理方法 随着“平安城市”的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于设备或者其他条件的限制,案情发生后的图像回放都存在图像不清晰,数据不完整的问题,无法为案件的及时侦破提供有效线索.经常出现嫌疑人面部特征不清晰,难以辨认,嫌疑车辆车牌模糊无法辨认等问题.这给公安部门破案.法院的取证都带来了极大的麻烦.随着平安城市的推广.各地各类监控系统建设的进一步推进,此类问题会越来越突出. 一.模糊

FPGA与数字信号处理

过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等需求的日益增加的结果.一些高性能应用正在不断发展,其中包括高级有线和无线音频.数据和视频处理. 通信和多媒体应用的发展,如互联网通信.安全无线通信以及消费娱乐设备,都在驱动着对能够有效实现复数运算和信号处理算法的高性能设备的需求. 这些应用中需要一些典型的DSP算法包括快速傅里叶变换(FFT).离散

例说信号处理与滤波器设计

许多公式在转换时成了乱码,相应的word版本请点这里 目录 数字时代    2 数字信号处理的应用    3 频率——信号的指纹    5 卷积可以不卷    8 向量运算的启示    11 滤波器设计征程    16 最后一击——滤波的实现方法    22 纵览全局    27 数字时代 信号处理是对原始信号进行改变,以提取有用信息的过程,它是对信号进行变换.滤波.分析.综合等处理过程的统称.数字信号处理是将信号以数字方式表示并处理的理论和技术:模拟信号处理是指用模拟系统对模拟信号进行处理的方

20145331 《信息安全系统设计基础》第11周学习总结

20145331<信息安全系统设计基础>第十一周学习总结 教材学习内容总结 8.1告诉你异常四种,其中陷阱可以用来做系统调用. Linux的聪明机制--/proc文件系统,将许多内核数据结构的内容输出为一个用户程序可以读的文本文件的层次结构. 8.2进程的概念,并发流.上下文切换在后面也要继续用到. 8.3错误处理包装函数. 8.4介绍了很多函数,Fork函数上课重点提到了,它是调用一次,返回两次:而且父子进程并发执行.execve函数那有些看不懂,仍在看. 8.5讲信号,类型很多,分发送和接

ECG - ADS1298 使用笔记(5)-PACING DETECTING/起搏检测

起搏检测在我的另外两篇博客提供了参考电路. http://blog.csdn.net/iamlvshijie/article/details/8922544 http://blog.csdn.net/iamlvshijie/article/details/9171517 本篇文章主要讲解ADS1298的起搏检测功能的实现. 实现方法 从数据手册上pace dectect 章节可以看到(sbas459H的69页)ads1298提供了两种方式检测起搏信号: 1 软件方法 要求采样率有一定的要求(采样

Php5.6.15-fpm的运行机制源码剖析

源码版本:Php5.6.15 源码目录:sapi/fpm/fpm 说明:源码的主要功能在上面直接注解 =============>>start<<================================ 主进程信号初始化,依据收到的信号类型,进行处理 int fpm_signals_init_main() /* {{{ */{struct sigaction act; //create sigaction structure and bind signal handle f