多线程的信号问题

多线程的信号问题redhat 2.6中:



int main()
{
pthread_t pid1;
pthread_t pid2;

pthread_create(&pid1,NULL ,thread1_fun,NULL);
pthread_create(&pid2,NULL,thread2_fun,NULL);

printf("main thread...\n");
pause();
printf("main thread alarm...\n");
while(1)
{
;
}

return 0;
}

void thread1_fun(void)
{
printf("thread1...\n");
pause();
printf("thread1 alarm...\n");
}

void thread2_fun(void)
{
printf("thread2...\n");
signal(SIGALARM,alarm_handler);
alarm(5);
pause();
printf("thread2 alarm...\n");
}

void alarm_handler(int sig)
{
printf("SIGALRM catched...\n");
}




为什么总是打印
main thread...
thread1...
thread2...
SIGALRM catched...
mainthread alarm...

怎么不是线程2收到SIGALRM,而是主线程收到呢?把alarm()换成setitimer()也一样

[ 本帖最后由 wliang511 于 2008-9-11 11:31 编辑 ]对于发送给进程的信号,好像没有标准规定由哪个线程处理,所以由主线程处理也算合理。不过不同的系统实现可能有差别,最好在不同的系统上测试下我的运行结果是

main thread...
thread1...
thread2...
SIGALRM catched...
thread2 alarm...原帖由 5毛党党员 于 2008-9-11 11:25 发表 http://bbs.chinaunix.net/images/common/back.gif
我的运行结果是

main thread...
thread1...
thread2...
SIGALRM catched...
thread2 alarm...

你的是什么环境啊?我的的fedora4,是虚拟机!linux 2.6.9-22
Red Hat Enterprise Linux AS release 4原帖由 wliang511 于 2008-9-11 11:09 发表 http://bbs.chinaunix.net/images/common/back.gif
redhat 2.6中:



int main()
{
pthread_t pid1;
pthread_t pid2;

pthread_create(&pid1,NULL ,thread1_fun,NULL);
pthread_create(&pid2,NULL,thread2_fun,NULL);

printf( ...

发送给进程的信号http://www.iabna.com/,一般是任意发送给它的线程的,除非是引起硬件故障或自己触发的某些信号。这是POSIX规定的线程处理信号的原语:
信号到达某个进程,然后再由该进程将信号分发到所有没有阻塞该信号的线程中。原帖由 cugb_cat 于 2008-9-11 13:09 发表 http://bbs.chinaunix.net/images/common/back.gif
这是POSIX规定的线程处理信号的原语:
信号到达某个进程,然后再由该进程将信号分发到所有没有阻塞该信号的线程中。

怎么觉得我应该是分发到任意一个没有阻塞该信号的线程中回复 #1 wliang511 的帖子

三种禁用FSO的方法 (ZT)

我在linux服务器上运行结果是:

# ./lmulti
main thread...
thread1...
thread2...
SIGALRM catched...
main thread alarm...
在我的嵌入式arm系统上结果是:
/dvs/test $ ./multi
thread1...
main thread...
thread2...
SIGALRM catched...
thread2 alarm...原帖由 cugb_cat 于 2008-9-11 13:09 发表 http://bbs.chinaunix.net/images/common/back.gif
这是POSIX规定的线程处理信号的原语:
信号到达某个进程http://www.ayahi.com/,然后再由该进程将信号分发到所有没有阻塞该信号的线程中。

只会发给一个线程吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值