三十二、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 ...
随机推荐
- linux deb系 rpm系 配置路由
deb: 添加默认路由:route add default gw 8.46.192.1 添加网段路由:route add -net 8.46.0.0/19 gw 8.46.192.1 删除路由:把 a ...
- One Person Game ZOJ - 3329(期望dp, 数学)
There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. ...
- SCOI2009游戏 (数论+dp)
题解 很显然,对于一个确定的排列,每个数字的移动规则是一定的,我们根据这个排列,把它抽象为i向a[i]连一条边,很显然最后会构成一个环,那么行数就是这些环长的lcm. 那么问题变成了把n任意进行划分, ...
- Bootloader升级方式一————擦、写flash在RAM中运行
在汽车ECU软件运行中,软件代码运行安全性是第一,在代码中尽可能的不要固化有flash_erase.flash_write操作存在,主要是防止当出现异常情况时,程序跑飞,误调用erase.write对 ...
- OnCheckedChangeListener和setChecked之间冲突问题解决
判断是否点击!buttonView.isPressed()来解决 CompoundButton.OnCheckedChangeListener checkedChangeListener = new ...
- jquery 表单序列化
1.序列化为URL 编码文本字符串 var serialize = $("form[name=testForm]").serialize(); console.log(serial ...
- Git中撤销提交
Git的几种状态 未修改 原始内容 已修改 ↓ 工 作 区 已暂存 ↓ git add 暂 存 区 已提交 ↓ git commit 本地仓库 已推送 ↓ git push 远程仓库 注意:下面所有命 ...
- 洛谷P4219 大融合
LCT新姿势:维护子树信息. 不能带修,子树修改就要toptree了... 题意:动态加边,求子树大小. 解: 维护子树信息只要额外维护虚边连的儿子的信息即可.这里把siz的定义变成子树大小. 哪里会 ...
- Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
1.开发环境配置 Windows7 64位旗舰版 python3.6 node.js mysql navicat pycharm webstorm或vscode 2.项目初始化 新版的pycharm很 ...
- django 通过ajax完成登录
一. 在users/views.py中加代码: from django.http import HttpResponse class LoginView(View): ""&quo ...