线程与信号
来源:互联网 发布:mac 终端 古老 编辑:程序博客网 时间:2024/06/15 18:44
每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。
进程中的信号是递送给单个线程的。
多线程中使用函数pthread_sigmask来阻止信号发送。
线程可以通过sigwait等待一个或者多个信号的出现。
int sigwait(const sigset_t *restrict set, int *restrict signop);
set指定了线程等待的信号集,返回时,signop指向的整数将包含发送信号的数量。
如果信号集中的某个信号在sigwait调用的时候处于挂起状态(未处理),那么sigwait将无阻塞地返回。在返回之前,sigwait将从进程中移除那些处于挂起等待状态的信号。
sigwait函数监听被阻塞的信号,如果所监听的信号产生了,则将其从未决队列中移出来并返回
一个demo:
#include "apue.h"#include <pthread.h>int quitflag;//set nonzero by threadsigset_t mask;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_twaitloc = PTHREAD_COND_INITIALIZER;void *thr_fn(void *args){int err, signo;for (; ;){err = sigwait(&mask, &signo);//sigwait函数监听被阻塞的信号,如果所监听的信号产生了,则将其从未决队列中移出来并返回if (err != 0){err_exit(err, "sigwait failed");}switch (signo){case SIGINT:printf("\ninterrupt\n");break;case SIGQUIT:pthread_mutex_lock(&lock);quitflag = 1;pthread_mutex_unlock(&lock);pthread_cond_signal(&waitloc);return 0;default:printf("unexpected signal %d\n", signo);exit(1);}}}int main(){interr;sigset_toldmask;pthread_ttid;sigemptyset(&mask);sigaddset(&mask, SIGINT);sigaddset(&mask, SIGQUIT);if ((err = pthread_sigmask(SIG_BLOCK, &mask, &oldmask)) != 0){err_exit(err, "SIG_BLOCK error");}err = pthread_create(&tid, NULL, thr_fn, 0);if (err != 0){err_exit(err, "can't create thread");}pthread_mutex_lock(&lock);while (quitflag == 0){pthread_cond_wait(&waitloc, &lock);//pthread_cond_wait函数先解锁lock,待条件变量满足收到信号之后返回再次锁上lock}pthread_mutex_unlock(&lock);//SIGQUIT has been caught and is now blocked; do whatever.quitflag = 0;//reset signal mask which unblocks SIGQUIT.if ((sigprocmask(SIG_SETMASK, &oldmask, NULL)) < 0){err_sys("SIG_SETMASK error");}exit(0);};
0 0
- 线程与信号
- 线程与信号
- 线程与信号
- 线程与信号
- 信号与线程
- 线程与信号
- 线程与信号
- 线程与信号
- 线程与信号
- 进程与信号、线程与信号
- 线程与信号,线程与锁
- Linux中线程与信号
- [glibc-manual]34.9 线程与信号处理
- 跨线程的信号与槽
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- JS循环遍历JSON数组
- Java之接口与工厂详解一(附源码)
- [libevent]epoll_add()
- JAVA用画板JFrame画布Panel画笔Graphics画一个星星,显示拖动的痕迹-3
- Android Dialog 的一些特性
- 线程与信号
- Mysql Create命令小结
- 阿里云日志服务日志写入华东2配置
- 单例模式加锁优化问题
- CentOS 6.4 下安装vsftpd
- Swift3.0获取网关地址
- 金税接口
- Android4.4 Sensor APP-->HAL代码流程
- 七彩智能组卷软件系统 V4.9.0.0官方版