#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> void sig_thread_func(int sig) { printf("sig_thread_func : sig = %dn", sig); } void sig_func(int sig) { printf("sig_func : sig = %dn",sig); } void *func1(void *arg) { signal(SIGUSR1, sig_thread_func); //线程1先运行,设置了signal sigset_t set; sigfillset(&set); sigdelset(&set, SIGUSR1); pthread_sigmask(SIG_SETMASK, &set, NULL);//线程1屏蔽了除了SIGUSR1外的所有信号 printf("pthread 1 runn"); int i; for(i = 0; i < 7; ++i) { printf("1...n"); sleep(1); } return 0; } void *func2(void *arg) { printf("pthread 2 runn"); int i; for(i = 0; i < 7; ++i) { printf("2...n"); sleep(1); } return 0; } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, func1, NULL); pthread_create(&tid2, NULL, func2, NULL); sleep(1); signal(SIGUSR1, sig_func); //覆盖了线程1设置的signal //向线程1发送SIGUSR1,SIGUSR2 sleep(1); pthread_kill(tid1, SIGUSR1);//调动handler sleep(1); pthread_kill(tid1, SIGUSR2);//屏蔽了,无响应 //向线程2发送SIGUSR1,SIGUSR2 sleep(1); pthread_kill(tid2, SIGUSR1);//调用handler sleep(1); //pthread_kill(tid2, SIGUSR2);//会终止进程,是进程! sigset_t set; sigfillset(&set); sigprocmask(SIG_SETMASK, &set, NULL);//进程屏蔽了所有信号 sleep(1); kill(getpid(), SIGUSR1);//调动handler?其实是线程1响应的 pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; }
运行结果:
[cpp] view plaincopyprint? 01.huangcheng@ubuntu:~$ ./a.out 02.pthread 2 run 03.2... 04.pthread 1 run 05.1... 06.2... 07.1... 08.2... 09.sig_func : sig = 10 10.1... 11.2... 12.1... 13.sig_func : sig = 10 14.2... 15.1... 16.2... 17.1... 18.2... 19.sig_func : sig = 10 20.1... huangcheng@ubuntu:~$ ./a.out pthread 2 run 2... pthread 1 run 1... 2... 1... 2... sig_func : sig = 10 1... 2... 1... sig_func : sig = 10 2... 1... 2... 1... 2... sig_func : sig = 10 1... (编辑:云计算网_泰州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|