三十二、Linux 进程与信号——不可靠信号
32.1 不可靠信号问题
- 发生信号时关联动作被重置为默认设置
- 信号可能丢失
- 程序片段
- 在进入 sig_int 与再次调用 signal 之间发生的 SIGINT 信号将不会捕获
- 导致进程终止

以前版本会由这个问题,当前的 Linux 版本是安全的
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> void sig_handler(int signo)
{
if(signo == SIGINT){
printf("process the SIGINT\n");
sleep();
printf("%d catch SIGINT\n", getpid());
printf("process the SIGINT finished\n");
} if(signo == SIGTSTP){
printf("process the SIGTSTP\n");
sleep();
printf("%d catch SIGTSTP\n", getpid());
printf("process the SIGTSTP finished\n");
}
} int main(void)
{
if(signal(SIGINT, sig_handler) == SIG_ERR){
perror("signal sigint error");
} if(signal(SIGTSTP, sig_handler) == SIG_ERR){
perror("signal sigtstp error");
} printf("begin running\n"); while() pause(); ///< 进程暂停等待信号 printf("end running\n");
return ;
}

对于连续发送相同信号,会进行延迟处理,发送查过 2 次以上不会处理。此机制与内核有关。
- 无法暂时阻塞信号
- 只能忽略信号
- 信号可能被丢失
- 程序片段
- 检测 sig_int_flag 变量和调用 pause 函数之间有个时间窗口
- 如果再该时间窗口内发生 SIGINT 信号?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h> int is_sig_occ = ; void sig_handler(int signo)
{
printf("signo occured: %d\n", signo);
is_sig_occ = ;
} int main(void)
{
if(signal(SIGINT, sig_handler) == SIG_ERR){
perror("signal sigint error");
} printf("begin running\n");
while(is_sig_occ == ){
sleep();
pause(); ///< 进程暂停等待信号发生
}
printf("I will running\n");
return ;
}

5s 之内执行的代码,pause后面的程序不会再执行,必须再发送一个信号后才可以执行。
建议将依赖于信号而执行的代码放置到信号处理函数中执行,否则这些代码可能不会执行
32.2 信号的特点
- 信号的发生是随机的,但信号在何种条件下发生是可预测的
- 进程刚开始启动时,所有信号的处理方式要么默认,要么忽略,忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方式(大多数是终止进程)
- 进程在调用 exec 函数后,原有信号的捕捉函数失效
- 子进程的诞生总是继承父进程的信号处理方式
- 在系统层面上,信号的发生是可靠的,
- 在Linux 中的可靠性只保证依次,进程在处理信号期间若发生同类型的信号不会丢失(内核会保留),会被延迟处理,但同类型信号的多次发生只会保留一次,即被处理一次。
- 若不同类型的信号发生,也会被内核保留直接会被处理,处理完后,再处理原有信号
三十二、Linux 进程与信号——不可靠信号的更多相关文章
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- (转载)Android项目实战(三十二):圆角对话框Dialog
Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
- COJ968 WZJ的数据结构(负三十二)
WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...
- NeHe OpenGL教程 第三十二课:拾取游戏
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)
摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...
- Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
- Gradle 1.12用户指南翻译——第三十二章. JDepend 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十二关(基于宽字符逃逸注入)
开始挑战第三十二关(Bypass addslashes) 0x1查看源代码 (1)代码关键点 很明显,代码中利用正则匹配将 [ /,'," ]这些三个符号都过滤掉了 function che ...
随机推荐
- iptables(3)
----------------------------iptables企业应用 ****************************单机防火墙列表#!/bin/bash#============ ...
- springboot jar包运行中获取资源文件
1. 今天晚上写了一个程序,基于Spring boot的一个小网站,发现使用FileUtils.class.getResource(path)来获取jar包中的资源文件并不能成功,其路径很奇怪 fil ...
- java 不定长参数
一,不定长参数的规定 一个方法只能有一个不定长参数,并且这个不定长参数必须是该方法的最后一个参数. 示例: public class VariArgs { public static void mai ...
- [HEOI2014]平衡
[HEOI2014]平衡 转化为求选择k个数,和为(n+1)*k的方案数 保证,每个数[1,2*n+1]且最多选择一次. 限制k个很小,所以用整数划分的第二种方法 f[i][j],用了i个,和为j 整 ...
- B1018. 锤子剪刀布
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出正整数N( ...
- JavaScript FormData的详细介绍及使用
本文转自:https://blog.csdn.net/liupeifeng3514/article/details/78988001 FormData的详细介绍及使用请点击此处,那里对FormData ...
- SourceInsight快捷键
下载安装与设置 https://blog.csdn.net/k346k346/article/details/77412413 常用设置总结的还是比较全面的 问题: SourceInsight4.0中 ...
- sprintf() 处理 float类型的数字,保留小数位等。
关于 sprintf()的百科地址: http://baike.baidu.com/view/1295144.htm sprintf(szText, "%[填空字元][宽度][.精度]f&q ...
- Git使用全解
起步 关于版本控制 Git 简史 Git 基础 安装 Git 初次运行 Git 前的配置 获取帮助 小结 Git 基础 取得项目的 Git 仓库 记录每次更新到仓库 查看提交历史 撤消操作 远程仓库的 ...
- 初始redis数据库
redis就是一个类似于存储在内存中的大字典 安装: windows下安装redis: 你需要在你的环境下安装: pip install redis 以上是在你的全局环境安装, 你如果用的是虚拟环境你 ...