示例代码:
[cpp] view plaincopyprint? 01.#include <stdio.h> 02.#include <pthread.h> 03.#include <unistd.h> 04.#include <stdlib.h> 05.#include <signal.h> 06. 07.void sig_thread_func(int sig) 08.{ 09. printf("sig_thread_func : sig = %dn", sig); 10.} 11.void sig_func(int sig) 12.{ 13. printf("sig_func : sig = %dn",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 runn"); 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 runn"); 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.}
查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/ (编辑:云计算网_泰州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|