我是靠谱客的博主 爱听歌小懒猪,最近开发中收集的这篇文章主要介绍linux捕获信号处理,linux 捕获信号处理中遇到的死锁,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

tag: 信号 signal  sigchld  死锁 堆栈

我们的程序需要捕获信号自己处理,所以尝试对1-32的信号处理(后面33-64的信号不处理)。

但是在调试代码时,发现一个线程死锁的问题。

程序目的:捕获信号,然后打印堆栈。

Thread 12 (Thread 0xf7dd2b90 (LWP 5770)):

以下是一个让我觉得奇怪的堆栈,奇怪之处:

1.死锁了:__lll_lock_wait_private

2.获得了2个信号:,为什么不是一个一个信号处理

堆栈如下:

#18 0x0804fa02 in boom ()

boom()是我写的一个制造崩溃的函数:

char *pBoom = NULL;

memcpy( pBoom, "aaaa", 100 );

#16

触发信号

#15 0x080f9844 in TsSigHandler(int, siginfo*, void*) ()

TsSigHandler是信号处理函数。通过以下代码设置:

struct sigaction sigact;

sigemptyset( &sigact.sa_mask );

sigact.sa_flags = SA_ONESHOT | SA_SIGINFO;

sigact.sa_sigaction = TsSigHandler;

信号触发后,由TsSigHandler函数处理

#14 0x080f95c1 in PrintStack() ()

TsSigHandler函数中调用PrintStack函数打印堆栈。

#13 0x00317ead in system () from /lib/libpthread.so.0

PrintStack函数中调用了system函数做一些额外的事情,例如执行gcore(事实证明,这种方法是有点问题的)。

#11 0x001f8132 in do_system () from /lib/libc.so.6

system调用了do_system

#10 0x001eb1a9 in sigprocmask () from /lib/libc.so.6

do_system调用sigprocmask

#8 

关键来了:这是获取到了另外一个信号:SIGCHLD。

#7  0x080f9844 in TsSigHandler(int, siginfo*, void*) ()

又调用信号处理函数TsSigHandler

#3  0x001f7f8b in do_system () from /lib/libc.so.6

system调用do_system,调用流程和上面当然是一样的

#2  0x001f8448 in _L_lock_124 () from /lib/libc.so.6

#1  0x002a0783 in __lll_lock_wait_private () from /lib/libc.so.6

nice!锁住了。。

分析:

system()函数执行的大体过程是:fork()->exec()->waitpid(),

waitpid用于等待子进程执行完毕。

但是在子进程执行完毕时,会产生SIGCHLD信号,

而SIGCHLD信号会唤醒wait中的进程,这就是看到了2个信号的原因,

解决方法:

1.忽略SIGCHLD信号:其实这个信号一般情况下应该被忽略,除非你的程序需要对这种情况做非常特殊的处理

2.不要在这里调用system()

to do: 有空了记得补详细些

最后

以上就是爱听歌小懒猪为你收集整理的linux捕获信号处理,linux 捕获信号处理中遇到的死锁的全部内容,希望文章能够帮你解决linux捕获信号处理,linux 捕获信号处理中遇到的死锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部