线程与信号
来源:互联网 发布:手机word办公软件 编辑:程序博客网 时间:2024/05/24 06:44
总结:
signal()设置对某种信号的处理方式,只能有一种处理方式,即设置进程、线程的信号handler,对进程、线程都有效。
pthread_kill()可以向线程发送信号。
pthread_sigmask()设置线程的阻塞信号集,但是仅仅对该线程有效。
kill()向进程发送信号,由哪个线程处理该信号是未知的。可能发生的情况是,进程本身屏蔽了该信号,而某个线程没有屏蔽改信号,进而该线程处理了该信号。
示例:
#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 = %d\n", sig);}void sig_func(int sig){printf("sig_func : sig = %d\n",sig);}void *func1(void *arg){ signal(SIGUSR1, sig_thread_func); //线程1先运行,设置了signalsigset_t set;sigfillset(&set);sigdelset(&set, SIGUSR1);pthread_sigmask(SIG_SETMASK, &set, NULL);//线程1屏蔽了除了SIGUSR1外的所有信号printf("pthread 1 run\n");int i;for(i = 0; i < 7; ++i){printf("1...\n");sleep(1);}return 0;}void *func2(void *arg){printf("pthread 2 run\n");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,SIGUSR2sleep(1);pthread_kill(tid1, SIGUSR1);//调动handlersleep(1);pthread_kill(tid1, SIGUSR2);//屏蔽了,无响应 //向线程2发送SIGUSR1,SIGUSR2sleep(1);pthread_kill(tid2, SIGUSR1);//调用handlersleep(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;}结果:
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响应的。
- 线程与信号
- 线程与信号
- 线程与信号
- 线程与信号
- 信号与线程
- 线程与信号
- 线程与信号
- 线程与信号
- 线程与信号
- 进程与信号、线程与信号
- 线程与信号,线程与锁
- Linux中线程与信号
- [glibc-manual]34.9 线程与信号处理
- 跨线程的信号与槽
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- jbpm4.4学习总结(四)请假流程
- Android网络图片异步加载
- MongoDB 集群 for windows
- java学习笔记—自定义实现linkedList集合
- ckeditor(二)详细配置参数
- 线程与信号
- 数据库转换工具SqlServer To Oracle DbConvert
- Xsd 验证xml--C#
- eclipse 使用
- Linux su 几点建议
- 编译WpdPack提供的例子是出错!!
- 通达OA创建mysql存储过程 进行mysql压力测试
- 技术改变“钱包” 智能手机将成为移动支付的战场?
- 如何让IOS应用从容地崩溃