分享

线程与信号

 心不留意外尘 2016-05-10

http://blog.csdn.net/gpengtao/article/details/7921404

2012

总结:

signal()设置对某种信号的处理方式,只能有一种处理方式,即设置进程、线程的信号handler,对进程、线程都有效。
pthread_kill()可以向线程发送信号。
pthread_sigmask()设置线程的阻塞信号集,但是仅仅对该线程有效。
kill()向进程发送信号,由哪个线程处理该信号是未知的。可能发生的情况是,进程本身屏蔽了该信号,而某个线程没有屏蔽改信号,进而该线程处理了该信号。

示例:

  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #include <unistd.h>  
  4. #include <stdlib.h>  
  5. #include <signal.h>  
  6.   
  7. void sig_thread_func(int sig)  
  8. {  
  9.     printf("sig_thread_func : sig = %d\n", sig);  
  10. }  
  11. void sig_func(int sig)  
  12. {  
  13.     printf("sig_func : sig = %d\n",sig);  
  14. }  
  15.   
  16. void *func1(void *arg)  
  17. {  
  18.     signal(SIGUSR1, sig_thread_func);   //线程1先运行,设置了signal  
  19.   
  20.     sigset_t set;  
  21.     sigfillset(&set);  
  22.     sigdelset(&set, SIGUSR1);  
  23.     pthread_sigmask(SIG_SETMASK, &set, NULL);//线程1屏蔽了除了SIGUSR1外的所有信号  
  24.   
  25.     printf("pthread 1 run\n");  
  26.     int i;  
  27.     for(i = 0; i < 7; ++i)  
  28.     {  
  29.         printf("1...\n");  
  30.         sleep(1);  
  31.     }  
  32.     return 0;  
  33. }  
  34. void *func2(void *arg)  
  35. {  
  36.     printf("pthread 2 run\n");  
  37.     int i;  
  38.     for(i = 0; i < 7; ++i)  
  39.     {  
  40.         printf("2...\n");  
  41.         sleep(1);  
  42.     }  
  43.     return 0;  
  44. }  
  45.   
  46. int main()  
  47. {  
  48.     pthread_t tid1, tid2;  
  49.     pthread_create(&tid1, NULL, func1, NULL);  
  50.     pthread_create(&tid2, NULL, func2, NULL);  
  51.   
  52.     sleep(1);  
  53.     signal(SIGUSR1, sig_func);  //覆盖了线程1设置的signal  
  54.   
  55.     //向线程1发送SIGUSR1,SIGUSR2  
  56.     sleep(1);  
  57.     pthread_kill(tid1, SIGUSR1);//调动handler  
  58.     sleep(1);  
  59.     pthread_kill(tid1, SIGUSR2);//屏蔽了,无响应  
  60.   
  61.     //向线程2发送SIGUSR1,SIGUSR2  
  62.     sleep(1);  
  63.     pthread_kill(tid2, SIGUSR1);//调用handler  
  64.     sleep(1);  
  65.     //pthread_kill(tid2, SIGUSR2);//会终止进程,是进程!  
  66.   
  67.     sigset_t set;  
  68.     sigfillset(&set);  
  69.     sigprocmask(SIG_SETMASK, &set, NULL);//进程屏蔽了所有信号  
  70.   
  71.     sleep(1);  
  72.     kill(getpid(), SIGUSR1);//调动handler?其实是线程1响应的  
  73.   
  74.     pthread_join(tid1, NULL);  
  75.     pthread_join(tid2, NULL);  
  76.   
  77.     return 0;  
  78. }  
结果:

pthread 1 run
1...
pthread 2 run
2...
1...
2...
sig_func : sig = 10
1...
2...
1...
2...
sig_func : sig = 10
2...
1...
2...
1...
2...
sig_func : sig = 10
1...

一共对SIGUSR1响应了3次,分别是线程1、2、1响应的。





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多