【Linux系统编程】26.信号、kill、alarm、setitimer

目录

信号

信号共性

信号特质

产生信号

信号相关概念

默认处理动作

信号4要素

常规信号  ​编辑

注意

kill

参数pid

测试代码1

测试结果

测试代码2

测试结果

alarm

参数seconds

返回值

取消闹钟

测试代码3

测试结果1

测试结果2  ​编辑

setitimer

参数which

参数new_value

参数old_value

测试代码4

测试结果

信号集操作函数

信号

信号共性

  • 简单

  • 不能携带大量信息

  • 满足条件才能发送

信号特质

       信号是软件层面上的“中断”,一旦信号产生,无论程序执行到什么位置,都必须立即停止运行,处理信号,处理完成后,再继续执行后续程序。所有信号的产生及处理都是由内核完成。

产生信号

  1. 按键产生

  2. 系统调用产生

  3. 软件条件产生

  4. 硬件异常产生

  5. 命令产生

信号相关概念

未决:产生与递达之间的状态。

递达:产生并且送达到进程,直接被内核处理掉。

信号处理方式

  1. 执行默认处理动作。

  2. 忽略。

  3. 捕捉。

阻塞信号集(信号屏蔽字):本质是位图。用来记录信号的屏蔽状态。一旦被屏蔽的信号,在解除屏蔽之前,一直处于未决态。

未决信号集:本质是位图。用来记录信号的处理状态。该信号集中的信号表示已经产生,但未被处理。

默认处理动作

Term:终止进程。

lgn:忽略信号。

Core:终止进程,生成Core文件。可以查验进程死亡原因,用gdb进行调试。

Stop:停止进程或暂停进程。

Cont:继续运行进程。

信号4要素

信号使用之前,必须先确定其4要素,再进行使用。

  1. 信号编号

  2. 信号名称

  3. 信号对应时间

  4. 信号默认处理动作

man 7 signal

       在标准信号中,有一些信号是有三个“Value”,第一个值通常对alpha和sparc架构有效,中间值针对x86、arm和其他架构,最后一个应用于mips架构。一个‘-’表示在对应架构上尚未定义该信号。

       不同的操作系统定义了不同的系统信号。因此有些信号出现在Unix系统内,也出现在Linux 中,而有的信号出现在FreeBSD或Mac OS中却没有出现在Linux下。

常规信号  

  1. SIGHUP:当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作为终止进程。

  2. SIGIN:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。

  3. SIGQUIT:当用户按下<ctrl+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号。默认动作为终止进程。

  4. SIGILL:CPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件。

  5. SIGTRAP:该信号由断点指令或其他trap指令产生。默认动作为终止进程并产生core文件。

  6. SIGABRT:调用abort函数时产生该信号。默认动作为终止进程并产生core文件。

  7. SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。

  8. SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。 默认动作为终止进程并产生core文件。

  9. SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法。

  10. SIGUSE1:用户定义的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。

  11. SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。

  12. SIGUSR2:另外一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程。

  13. SIGPIPE:Broken pipe向一个没有读端的管道写数据。默认动作为终止进程。

  14. SIGALRM:定时器超时,超时的时间由系统调用alarm设置。默认动作为终止进程。

  15. SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行 shell命令Kill时,缺省产生这个信号。默认动作为终止进程。

  16. SIGSTKFLT:Linux早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程。

  17. SIGCHLD:子进程状态发生变化时,父进程会收到这个信号。默认动作为忽略这个信号。

  18. SIGCONT:如果进程已停止,则使其继续运行。默认动作为继续/忽略。

  19. SIGSTOP:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为暂停进程。

  20. SIGTSTP:停止终端交互进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。

  21. SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。

  22. SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。

  23. SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据到达,默认动作为忽略该信号。

  24. SIGXCPU:进程执行时间超过了分配给该进程的CPU时间 ,系统产生该信号并发送给该进程。默认动作为终止进程。

  25. SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。

  26. SIGVTALRM:虚拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默认动作为终止进程。

  27. SGIPROF:类似于SIGVTALRM,它不公包括该进程占用CPU时间还包括执行系统调用时间。默认动作为终止进程。

  28. SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。

  29. SIGIO:此信号向进程指示发出了一个异步IO事件。默认动作为忽略。

  30. SIGPWR:关机。默认动作为终止进程。

  31. SIGSYS:无效的系统调用。默认动作为终止进程并产生core文件。

34~64. LINUX 的实时信号,它们没有固定的含义,可以由用户自定义。所有的实时信号的默认动作都为终止进程。

注意

       9) SIGKILL和19) SIGSTOP信号,不允许忽略和捕捉,只能执行默认动作。甚至不能将其设置为阻塞。

        只有每个信号所对应的事件发生了,该信号才会被递送,但不一定递达,不应乱发信号!

kill

man 2 kill

参数pid

大于0:发送信号给指定进程。

等于0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。

小于-1:取绝对值,发送信号给该绝对值所对应的进程组的所有进程。

等于-1:发送信号给有权限发送的所有进程,普通用户基本规则是,发送者实际或有效用户ID==接收者实际或有效用户ID。

测试代码1

用子进程杀了父进程。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>int main(int argc, char *argv[])
{pid_t JinCheng_ID;JinCheng_ID = fork();if (JinCheng_ID > 0) //父进程{printf("这是父进程,该进程ID是%d。开始进入死循环。\n", getpid());while (1){printf("这是父进程,已在死循环。\n");sleep(1);}}else if (JinCheng_ID == 0) //子进程{printf("这是子进程,该进程ID是%d。先睡一会再杀父进程。\n", getpid());sleep(3);printf("这是子进程,该进程ID是%d。睡醒了,我杀。\n", getpid());kill(getppid(),SIGKILL);printf("这是子进程,该进程ID是%d。杀完了,拜拜。\n", getpid());}return 0;
}

测试结果

 

测试代码2

杀进程组

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>int main(int argc, char *argv[])
{pid_t JinCheng_ID;JinCheng_ID = fork();if (JinCheng_ID > 0) //父进程{printf("这是父进程,该进程ID是%d。开始进入死循环。\n", getpid());while (1){printf("这是父进程,已在死循环。\n");sleep(1);}}else if (JinCheng_ID == 0) //子进程{printf("这是子进程,该进程ID是%d。先睡一会再杀进程组。\n", getpid());sleep(3);printf("这是子进程,该进程ID是%d。睡醒了,我杀。\n", getpid());kill(0, SIGKILL);printf("这是子进程,该进程ID是%d。杀完了,拜拜。\n", getpid());}return 0;
}

测试结果

进程组被杀后,子进程最后的输出不再进行输出。

 

alarm

定时发送SIGALRM给当前进程。

实际时间=用户时间+内核时间+等待时间,代码优化,优先从IO下手。

man 2 alarm

参数seconds

定时秒数。

返回值

上次剩余的时间。

取消闹钟

alarm(0);

测试代码3

查看程序1秒钟的计数次数。

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[])
{int i = 0;alarm(1); //定时1秒while (1){printf("%d\n", i++);}return 0;
}

测试结果1

测试结果2  

setitimer

设置定时器(闹钟)。 可代替alarm函数。精度微秒us,可以实现周期定时。

man 2 setitimer

参数which

指定定时方式。

  • ITIMER_REAL:自然定时,计算自然时间,信号是14)SIGLARM。

  • ITIMER_VIRTUAL:虚拟空间计时(用户空间),只计算进程占用cpu的时间,信号是26)SIGVTALRM。

  • ITIMER_PROF:运行时计时(用户+内核),计算占用cpu及执行系统调用的时间,信号是27)SIGPROF。

参数new_value

定时秒数。

struct itimerval {struct timeval it_interval; //后续每个中断的间隔执行时间struct timeval it_value;    //第一次执行中断的时间
};struct timeval {time_t      tv_sec;         //秒suseconds_t tv_usec;        //微秒
};
struct itimerval {struct timeval {	//后续每个中断的间隔执行时间time_t      tv_sec;         //秒suseconds_t tv_usec;        //微秒}it_interval;struct timeval {	//第一次执行中断的时间time_t      tv_sec;         //秒suseconds_t tv_usec;        //微秒}it_value;
};

参数old_value

传出参数,上次定时剩余的时间。

测试代码4

周期性输出内容。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>void ChuLi_HanShu()
{printf("你好,世界!\n");
}int main(int argc, char *argv[])
{int i = 0;struct itimerval new_value, old_value;signal(SIGALRM, ChuLi_HanShu); //注册SIGALRM信号的捕捉处理函数//2秒后开始第1次中断new_value.it_value.tv_sec=2;new_value.it_value.tv_usec=0;//每5秒来一次中断new_value.it_interval.tv_sec=5;new_value.it_interval.tv_usec=0;if(setitimer(ITIMER_REAL,&new_value,&old_value)==-1){perror("设置中断错误");exit(1);}while (1){printf("%d秒\n", i++);sleep(1);}return 0;
}static

测试结果

信号集操作函数

sigset_t set;	//自定义信号集
sigemptyset(sigset_t *set);		//清空信号集
sigfillset(sigset_t *set);		//全部置1
sigaddset(sigset_t *set,int signum);	//每一个信号添加到集合中
sigdelset(sigset_t *set,int signum);	//将一个信号从集合中移除
sigismember(const sigset_t *set,int signum);	//判断一个信号是否在集合中。返回值:1:在;0:不在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BIO、NIO与AIO

一 BIO 同步并阻塞(传统阻塞型)&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器端就需要启动一个线程进行处理. BIO&#xff08;Blocking I/O&#xff0c;阻塞I/O&#xff09;模式是一种网络编程中的I/O处理模式。在BIO模式中&#xf…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽&#xff0c;大致可以分为两大类&#x…

网络攻击日益猖獗,安全防护刻不容缓

“正在排队登录”、“账号登录异常”、“断线重连”......伴随着社交软件用户的一声声抱怨&#xff0c;某知名社交软件的服务器在更新上线2小时后&#xff0c;遭遇DDoS攻击&#xff0c;导致用户无法正常登录。在紧急维护几小时后&#xff0c;这款软件才恢复正常登录的情况。 这…

有哪些好用电脑端时间定时软件?桌面日程安排软件推荐 桌面备忘录

随着现代生活节奏的加快&#xff0c;人们对于时间管理和任务提醒的需求越来越大。为了满足这一需求&#xff0c;市场上涌现出了众多桌面便签备忘录软件&#xff0c;它们不仅可以帮助我们记录待办事项&#xff0c;还能定时提醒我们完成任务。在这篇文章中&#xff0c;我将为大家…

WebGIS面试题(第六期)-GeoServer

WebGIS面试题&#xff08;第六期&#xff09; 以下题目仅为部分题目&#xff0c;全部题目在公众号 {GISer世界} &#xff0c;答案仅供参考!!! 因为本人之前做过相关项目用到了GeoServer&#xff0c;因此在简历上写了熟悉GeoServer。所以在相关面试中都有问到&#xff0c;所以我…

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

Root Motion动画与普通动画的区别 普通动画&#xff1a;动画文件里记录的是物体的绝对坐标和方向&#xff0c;在播放动画时&#xff0c;Unity会根据Animation中记录的值&#xff0c;直接修改游戏对象的坐标和方向&#xff0c;每一帧的坐标和方向都是通过插值计算得出来的&…

Int4:Lucene 中的更多标量量化

作者&#xff1a;来自 Elastic Benjamin Trent, Thomas Veasey 在 Lucene 中引入 Int4 量化 在之前的博客中&#xff0c;我们全面介绍了 Lucene 中标量量化的实现。 我们还探索了两种具体的量化优化。 现在我们遇到了一个问题&#xff1a;int4 量化在 Lucene 中是如何工作的以…

微服务之并行与分布式计算

一、概述 1.1集中式系统vs分布式系统 集中式系统 集中式系统完全依赖于一台大型的中心计算机的处理能力&#xff0c;这台中心计算机称为主机&#xff08;Host 或 mainframe &#xff09;&#xff0c;与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终…

【ARM 裸机】BSP 工程管理

回顾一下上一节&#xff1a;【ARM 裸机】NXP 官方 SDK 使用&#xff0c;我们发现工程文件夹里面各种文件非常凌乱&#xff1b; 那么为了模块化整理代码&#xff0c;使得同一个属性的文件存放在同一个目录里面&#xff0c;所以学习 BSP 工程管理非常有必要。 1、准备工作 新建…

校车车载4G视频智能监控系统方案

一、项目背景 随着社会的快速发展&#xff0c;校车安全问题日益受到人们的关注。为了提高校车运营的安全性&#xff0c;保障学生的生命安全&#xff0c;我们提出了一套校车车载4G视频智能监控系统方案。该系统能够实时监控校车内部和外部环境&#xff0c;及时发现并处理潜在的…

selenium 自动化测试课上实操指南1——百度搜索

1.环境准备 下面的所有资源可以从超星班级资料中下载&#xff0c;机房的同学在收到的文件夹中可以找到文件 非本校同学&#xff0c;免费加入学银在线课程&#xff0c;就可以在资料 根目录 > 02 课件新 > week09 web自动化测试02 里下载本次实操资料 1&#xff09;安…

【打工日常】云原生之搭建私有化web在线聊天软件LumenIM

一、LumenIM介绍 1.LumenIM简介 Lumen IM 是一个网页版在线聊天项目&#xff0c;前端使用 Naive UI Vue3&#xff0c;后端采用 GO 开发。 2.LumenIM功能 基于 WebSocket 服务做消息即时推送 支持私聊及群聊 支持多种聊天消息类型 例如:文本、代码块、图片及其它类型文件&…

15.接口自动化学习-Mock(挡板/测试桩)

场景&#xff1a; 新需求还未开发时&#xff0c;使用mock提早介入测试&#xff0c;等后边开发后&#xff0c;进行调试 三方接口返回效率低&#xff0c;使用mock技术走通流程 1.mock方式 &#xff08;1&#xff09;如果会写django或flask,可以写简单对应的代码 &#xff08;…

Mysql--基础知识点--0.1--脏读、不可重复读、幻读

1 脏读、不可重复读、幻读 1.1 脏读 如果一个事务读到了另一个事务已修改且未提交的数据&#xff0c;则发生了脏读现象。 1.2 不可重复读 在一个事务里面多次读取同一个数据&#xff0c;若前后两次读到的数据不一致&#xff0c;则发生不可重复读现象。 1.3 幻读 在一个…

redis7 for windows的安装教程

本篇博客主要介绍redis7的windows版本下的安装教程 1.redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的&#xff0c;基于内存的数据结构存储系统&#xff0c;可用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希表、列…

【软考高项】二十六、范围管理基础内容

一、管理基础 产品范围和项目范围 产品范围强调结果&#xff0c;项目范围强调结果 管理的新实践 &#xff1a;需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收…

three.js 学习笔记 | 光线投射技术 - 包围盒(碰撞检测)

文章目录 three.js 学习笔记光线投射技术实现3D场景交互事件 THREE.Raycaster坐标系的转换案例&#xff1a;选中的模型变为红色 包围盒Box3 - 碰撞检测AABB包围盒辅助器Box3Helper案例1&#xff1a;创建AABB包围盒/包围球computeBoundingBox与boundingBox 搭配使用&#xff0c;…

vivado Aurora 8B/10B IP核(1)

Aurora 8B/10B IP 支持 Kintex -7, Virtex -7 FPGA GTP 和 GTH 收发器&#xff0c;Artix -7 FPGA GTP 收发器, Zynq -7000 GTP and GTP 收发器。Aurora 8B/10B IP core 可以工作于单工或者全双工模式。IP CODE的使用也非常简单&#xff0c;支持 AMBA总线的 AXI4-Stream 协议。…

字符串函数及其模拟实现

目录 strlen函数介绍模拟实现 strcpy函数介绍模拟实现 strcat函数介绍模拟实现 strcmp函数介绍模拟实现 strncpy函数介绍模拟实现 strncat函数介绍模拟实现 strncmp函数介绍模拟实现 strtokstrstr函数介绍模拟实现 strerrorperror strlen 函数介绍 函数介绍&#xff1a; 字符串…

Leetcode 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“a…