曾做过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 信号处理相关推荐

  1. linux中信号的处理,linux中关于信号处理笔记(二)

    2 等待一个全局变量被设置 这种情况是等待一个信号处理程序设置一个全局变量.下面的例子用于捕捉中断信号和退出信号,但是希望仅当退出信号处理程序时,才唤醒主进程. #include #include # ...

  2. linux 系统对信号的处理,Linux下的信号处理函数总结

    1.信号处理函数 相关函数原型如下: #include sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处 ...

  3. linux进程通信发送方式,Linux服务器编程——Linux系统编程之进程通信

    进程通信又称IPC IPC方法 方法:管道(最简单) 信号(开销最小) 共享映射区/共享内存(无血缘关系) 本地套接字(最稳定) Linux文件类型: -   文件 d  目录 l   符号链接 s  ...

  4. linux下如何屏蔽代码,linux c 怎么屏蔽信号 使用sigprocmask命令

    SIGPROCMASK(2)             Linux Programmer's Manual            SIGPROCMASK(2) NAME sigprocmask - ex ...

  5. linux 信号_Linux中的信号处理机制 [四]

    信号与线程 Unix的信号机制在诞生之初,生活在只有进程(process)的相对单纯的环境中.自从Unix世界有了线程(thread)的概念,信号就被赋予了发往进程中某个特定线程的能力,当然,这也增加 ...

  6. linux c 禁止对外通信,Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

  7. Linux捕捉信号机制之(signal,kill)、(sigaction,sigqueue)

    linux下公有64个信号,kill -l 查看一下: 可以看到,缺少了32.33两个未知信号,从这里分界,前面31个信号是不可靠信号,后面的是可靠信号.当进程发生阻塞的时候(一下子发送很多信号),不 ...

  8. linux pid t 头文件_Linux信号处理

    什么是信号 信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源: 程序错误:除零,非法内存访问等. 外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等 ...

  9. Linux C: 信号及异常和捕捉函数原理

    #define SIGHUP 1 终端挂起或控制进程终止 #define SIGINT 2 终端中断(Ctrl+C 组合键) #define SIGQUIT 3 终端退出(Ctrl+\组合键) #de ...

最新文章

  1. python dataframe取某行某列_pandas dataframe.apply() 实现对某一行/列进行处理获得一个新行/新列...
  2. Java中Scanner的使用方法
  3. Oracle其他函数
  4. js实现webSocket客户端
  5. U盘:对于目标文件系统,文件过大放不到u盘里
  6. 格密码教程(二):格的基本定义,格基转换
  7. 环境科学跨考专计算机,环境 计算机相结合 跨学科
  8. python基础教程廖雪峰云-为什么看不懂廖雪峰的Python学习教程?
  9. 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
  10. boost安装_Boost编译与使用
  11. php中使用sftp教程,php 中的sftp 使用教程_PHP教程
  12. Ubuntu下F2FS文件系统的安装与挂载
  13. 摄影毁一生单反穷三代顺口溜_哪款便宜的单反相机好
  14. minigui[基础篇][11]—— 图标
  15. 2017年中秋前记录
  16. 【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理
  17. 对称加密与非对称加密结合应用
  18. Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)
  19. 英语学习 20190922
  20. mysql主备同步错误:Last_Error: Could not execute Update_rows event; Error_code: 1032;

热门文章

  1. 流处理框架Storm简介
  2. 程序员面试金典——18.13 最大字母矩阵
  3. 【前端】数组元素过滤
  4. Ubuntu18.04下NNIE模型转换环境搭建
  5. tensorflow不能调用GPU
  6. 2.熟悉LINUX的基本操作
  7. C++11 Intro - Thread Id
  8. WEB前端性能优化常见方法
  9. 【VB6 Gdi+进阶】序章
  10. 微软在线测试之lucky string,有关斐波那契的题目都在此了