linux 屏蔽信号 sig_kill sig_stop,linux 信号处理
曾做过signal相关的一点儿开发,谈谈我的一些理解。
首先,需要理解几个signal相关的函数。
sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sigNum 添加到信号集 sigSet 中;
sigdelset(sigset_t* sigSet, int sigNum) : 将信号 sigNum 从信号集 sigSet 中删除;
sigemptyset(sigset_t* sigSet) : 清空信号集;
sigfillset(sigset_t* sigSet) : 在信号集中打开所有的信号。
但是这个时候只是定义好了如此一个信号集,还有对信号的操作函数:
pthread_sigmask(int opCode, sigset_t* sigSet, sigset_t* oldSigSet) :
opCode 指定了如何对 sigSet 里的信号进行处理。opCode 有三个值: SIG_BLOCK
(将sigSet中的信号加到当前线程的屏蔽集中),SIG_UNBLOCK (将sigSet
中的信号从当前线程屏蔽集中删除),SIG_SETMASK (将sigSet 设为当前线程的屏蔽集)。 若oldSigSet !=
NULL,则将之前的信号屏蔽集存入其中。
另外还有个函数 sigprocmask() 也有类似功能。区别是:pthread_sigmask()
是线程库函数,用于多线程进程。sigprocmask() 是旧的实现,用于单线程的进程。
sigwait(sigset_t* sigSet, int* sigNum) : 当前线程等待 sigSet
中的信号。没有捕获到信号时,线程挂起;当捕获到时,函数返回,并将信号值存入 sigNum。
sigaction(int sigNum, sigaction* newAct, sigaction* oldAct) : 捕获信号
sigNum,并调用相应的处理函数(定义在 newAct 中)。
虽然sigwait() 和 sigaction() 都是用于捕获信号,但两者还是有较大区别:sigwait()
是阻塞的,线程会一直挂起直到捕获到信号,并且对信号的处理是定义在
sigwait()后的,只会在当前线程内执行;而sigaction()是非阻塞的,当信号被捕获时,会由进程内当前被调度到的线程来执行处理函数(好
像是,not very sure...),被哪个线程处理是随机的。
所以,sigaction()适用于对实时性要求很高的时候。而在普通情况下建议使用sigwait(),因为其具有较好的可控性。
另外,还需要注意的是,SIG_KILL(大家应该都用过kill -9 吧) 和 SIG_STOP 是不能被用户屏蔽或捕获的。
好了,当理解了这几个函数后,可以自己试着来对信号进行处理了。对于lz的需求,简单举例如下:
sigset_t blockSet, waitSet;
int sigNum;
linux 屏蔽信号 sig_kill sig_stop,linux 信号处理相关推荐
- linux中信号的处理,linux中关于信号处理笔记(二)
2 等待一个全局变量被设置 这种情况是等待一个信号处理程序设置一个全局变量.下面的例子用于捕捉中断信号和退出信号,但是希望仅当退出信号处理程序时,才唤醒主进程. #include #include # ...
- linux 系统对信号的处理,Linux下的信号处理函数总结
1.信号处理函数 相关函数原型如下: #include sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处 ...
- linux进程通信发送方式,Linux服务器编程——Linux系统编程之进程通信
进程通信又称IPC IPC方法 方法:管道(最简单) 信号(开销最小) 共享映射区/共享内存(无血缘关系) 本地套接字(最稳定) Linux文件类型: - 文件 d 目录 l 符号链接 s ...
- linux下如何屏蔽代码,linux c 怎么屏蔽信号 使用sigprocmask命令
SIGPROCMASK(2) Linux Programmer's Manual SIGPROCMASK(2) NAME sigprocmask - ex ...
- linux 信号_Linux中的信号处理机制 [四]
信号与线程 Unix的信号机制在诞生之初,生活在只有进程(process)的相对单纯的环境中.自从Unix世界有了线程(thread)的概念,信号就被赋予了发往进程中某个特定线程的能力,当然,这也增加 ...
- linux c 禁止对外通信,Linux c 屏蔽信号、切换信号
信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1. 信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...
- Linux捕捉信号机制之(signal,kill)、(sigaction,sigqueue)
linux下公有64个信号,kill -l 查看一下: 可以看到,缺少了32.33两个未知信号,从这里分界,前面31个信号是不可靠信号,后面的是可靠信号.当进程发生阻塞的时候(一下子发送很多信号),不 ...
- linux pid t 头文件_Linux信号处理
什么是信号 信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源: 程序错误:除零,非法内存访问等. 外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等 ...
- Linux C: 信号及异常和捕捉函数原理
#define SIGHUP 1 终端挂起或控制进程终止 #define SIGINT 2 终端中断(Ctrl+C 组合键) #define SIGQUIT 3 终端退出(Ctrl+\组合键) #de ...
最新文章
- python dataframe取某行某列_pandas dataframe.apply() 实现对某一行/列进行处理获得一个新行/新列...
- Java中Scanner的使用方法
- Oracle其他函数
- js实现webSocket客户端
- U盘:对于目标文件系统,文件过大放不到u盘里
- 格密码教程(二):格的基本定义,格基转换
- 环境科学跨考专计算机,环境 计算机相结合 跨学科
- python基础教程廖雪峰云-为什么看不懂廖雪峰的Python学习教程?
- 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- boost安装_Boost编译与使用
- php中使用sftp教程,php 中的sftp 使用教程_PHP教程
- Ubuntu下F2FS文件系统的安装与挂载
- 摄影毁一生单反穷三代顺口溜_哪款便宜的单反相机好
- minigui[基础篇][11]—— 图标
- 2017年中秋前记录
- 【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理
- 对称加密与非对称加密结合应用
- Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)
- 英语学习 20190922
- mysql主备同步错误:Last_Error: Could not execute Update_rows event; Error_code: 1032;