|
|
|
|
 老问题了,线程中如何使用信号? - worldcup [ 2005-09-24 08:37 | 586 byte(s)]
 Re: 老问题了,线程中如何使用信号? - h_falls [ 2005-09-25 19:06 | 46 byte(s)]
 Re: 老问题了,线程中如何使用信号? - wheelz [ 2005-09-24 10:39 | 255 byte(s)]
 Re: 老问题了,线程中如何使用信号? - gxcooo [ 2005-09-25 21:55 | 90 byte(s)]
 Re: 老问题了,线程中如何使用信号? - wheelz [ 2005-09-26 09:08 | 86 byte(s)]
 Re: 老问题了,线程中如何使用信号? - gxcooo [ 2005-09-26 10:36 | 104 byte(s)]
 Re: 老问题了,线程中如何使用信号? - wheelz [ 2005-09-26 11:25 | 511 byte(s)]
 Re: 老问题了,线程中如何使用信号? - gxcooo [ 2005-09-26 14:45 | 37 byte(s)]
 Re: 老问题了,线程中如何使用信号? - worldcup [ 2005-09-25 09:34 | 16 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
我在主进程中处理了ctrl+c(SIGINT)信号,运行正常,之后我又用pthread_create创建了一个线程,线程函数结构如下:
while(1)
{
...
sleep(N);
...
}
再运行程序,用ctrl+c退出,就不执行主进程的ctrl+c信号处理函数了,请问我在线程中应如何和主进程共享一个信号处理函数?
在线程中的while(1)上面也加入相同的一行代码:signal(SIGINT,fun); 再运行,有时就可以执行SIGINT信号处理函数,但有时也执行不了,很不稳定!
我查了一下以前的帖子,有网友说信号是针对进程的,不是针对线程的,不知如何理解?
谢谢大家!
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
线程之间本来就是共享sighandler的,但不共享sigmask。
当进程收到signal时具体由哪个线程来运行sighandler,是不确定的。
是在所有没有block此signal的线程中任选一个。
你的问题在于用了signal(),应该用sigaction()来安装sighandler
|
|
|
----
五月的鲜花开遍了原野, 鲜花掩盖着志士的鲜血。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
linux的signal是用sigaction()实现的,但是调用sigaction()的参数不一样,
换句话说,sigaction()可以模拟不可靠的信号signal()
看了一下,linux上glibc2的signal()确实可以多次有效,
说是采用的BSD模式(运行sighandler前会block该信号),
传统的UNIX上是一次有效的(运行sighandler前会设置回SIG_DFL)。
总的来说,应该用sigaction(),因为signal()有许多不确定性(implementation-dependent)。
并且man page明确说了,在multi-thread环境下,signal()的行为是不确定的。
|
|
|
----
五月的鲜花开遍了原野, 鲜花掩盖着志士的鲜血。
|
|
[Original]
[Print]
[Top]
|
|
|