设为首页 收藏本站
查看: 1639|回复: 0

[经验分享] linux中的 【信号】

[复制链接]

尚未签到

发表于 2018-5-20 09:47:37 | 显示全部楼层 |阅读模式
  信号的产生方式:
  1、键盘输入
  如 Ctrl+C 表示产生一个SIGINT信号
  2、异常产生信号
  如 程序执行到 2/0 这种情况、 管道的读段已经关闭而写端仍向管道中写入数据这种情况 等...
  3、通过命令向指定进程发送信号
  对信号的处理方式:
  1、忽略
  2、执行默认处理(通常为终止程序)
  3、执行自定义动作 (信号的捕捉)
  举个例子。
  下面这段程序,从0开始,每隔一秒输出一个不断增长的数值
DSC0000.png

  执行:
DSC0001.png

  显然 它是一个死循环,将会一直执行下去
  用信号中断它,可以直接用Ctrl + C
  这样内核会对该进程发送一个 SIGINT 信号,结束当前进程:
DSC0002.png

  此外,执行程序后 另外打开一个终端
  (其实在执行命令的语句后面加上 & 就可以让当前进程在后台运行,也就不需要另外打开中断了,这里这样做是为了更直观一些)
  先用 ps aux 命令查找到当前进程的 PID
  然后用 killl -l 命令查看所有信号:
DSC0003.png

  这里能够发现, Ctrl+C快捷键发送的 SIGINT 信号对应的2,
  而我当前进程的PID 为:20262
  那么,执行命令  : kill -2 20262 或者 kill -SIGINT 20262
  发现死循环的进程终止了
  接下来介绍几个信号集操作函数:
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
int sigpending(sigset_t *set);  第一个函数:
  sigemptyset 用来初始化 set 指向的 信号集,使所有信号对应的bit清零,表示该信号集不包含任何有效信号
  成功返回0,出错返回 -1
  第二个函数:
  sigfillset 同样用来初始化,不过跟上面那个 sigemptyset 作用相反,它表示该信号集包括系统支持的所有信号
  成功返回0,出错返回 -1
  在使用 sigset_t 类型变量之前,必须调用上述两个初始化阐述中的任意一个
  
  第三个函数:
  sigaddset 的作用是向指定信号集 set 中添加 有效信号
  成功返回0,出错返回 -1
  
  第四个函数:
  sigdelset 的作用是在指定信号集 set 中 删除有效信号
  成功返回0,出错返回 -1
  
  第五个函数:
  sigismember 用来判断指定的信号是否在指定信号集中
  若存在,返回1;  若不存在,返回0;  若出错,返回-1
  
  第六个函数:
  sigprocmask 可以读取或更改进程的信号屏蔽字
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

  成功返回0,失败返回-1
  其中第一个参数 how表示处理方式,有以下三种:
      ·SIG_BLOCK :
          set包含了我们希望添加到当前信号屏蔽字的信号  //相当于mask = mask | set
      ·SIG_UNBLOCK :
          set包含了我们希望从当前信号屏蔽字中解除阻塞的信号  //相当于 mask = mask | ~set
      ·SIG_SETMASK :
          设置当前信号屏蔽字为set所指向的值    //相当于 mask = set
  
  第七个函数:
  sigpending 读取当前进程的未决信号集,通过set参数传出
  成功返回0,失败返回-1
  
  接下来,用上面介绍的7个函数,实现一段功能
  
  
  
   DSC0004.png
  这里我定义的 print_sig 函数的作用是 将指定信号集的所有信号的存在情况打印出来
  
  main函数中, 第35行 将SIGINT信号添加进 s 信号集当中
  然后37行的 sigprocmask 执行完毕后,  SIGINT信号就相当于被阻塞了,同时,o保存的信号集就是之前的s(全 0)
  while循环 每次读取并打印 当前的未决信号集  每循环5次就恢复一次阻塞,如果没有信号被阻塞,则打印“recover block” 并继续执行循环,
  如果有信号被阻塞,那么在49行恢复阻塞完毕后,程序就会终止掉。
  
  运行结果:
   DSC0005.png
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-462421-1-1.html 上篇帖子: Linux 文件 下篇帖子: linux交换空间
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表