多线程的信号问题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 的帖子 我在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/,然后再由该进程将信号分发到所有没有阻塞该信号的线程中。
只会发给一个线程吧
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 的帖子 我在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/,然后再由该进程将信号分发到所有没有阻塞该信号的线程中。
只会发给一个线程吧