信号深入学习(上)

简介: 信号深入学习(上)

信号机制

A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,先去处理信号,处理完毕后再继续执行程序。与硬件中断类似——异步模式。但信号是软件层面上实现中断。

信号特质

由于信号是通过软件方法实现,其实现手段导致信号有很强的的延时性。但对于用户来说,这个延迟非常短,不易察觉
每个进程收到的所有信号,都是由内核负责发送的,内核处理。

信号共性

  • 1.简单
  • 2.不能携带大量信息
  • 3.满足某个特殊条件才能发送

信号产生以及处理方式

信号产生

  1. 按键产生 :Ctrl + c Ctrl + z Ctrl + \
  2. 系统调用产生: kill ,raise ,abort
  3. 软件条件产生 :定时器alarm
  4. 硬件异常产生: 非法访问内存(段错误),除零(浮点数例外),内存对齐出错(总线错误)
  5. 命令产生 :如: kill命令

递达:递送并到达进程
未决:产生和递达之间的状态,主要由于阻塞(屏蔽)导致该状态

信号处理方式

  1. 执行默认动作
  2. 忽略(丢弃)
  3. 捕捉(调用户处理函数)

阻塞信号集和未决信号集

Linux内核的进程控制块PCB是一个结构体,task struct 除了包含进程id,状态,工作目录,用户ID,
组ID,文件描述符表,还包含了信号相关的信息,主要指阻塞信号集和未决型号集

阻塞信号集(信号屏蔽字)

将某些信号加入集合,对他们设置屏蔽,当屏蔽x信号后,再收到该信号,该信号的处理将退后(解除屏蔽后)

未决信号集

1.信号产生,未决信号集中描述该信号的位立刻翻转为1,表示该信号处于未决状态。当信号被处理对应位翻转回为0,这一刻往往非常短暂。
2.信号产生后由于某些原因(主要是阻塞)不能抵达。这类信号的集合称之为未决信号集,在屏蔽解除前。信号一直处于未解决状态。

信号查看

kill -l

可以查看当前信号系统可以使用的信号有哪些
在这里插入图片描述
不存在编号为0的信号,其中1-31号信号称之为常规信号(也叫常规信号或标准信号),34-64称之为实时信号,驱动编程与硬件相关。名字上区别不大。而前32个名字各不相同

信号四要素

信号编号,信号名称,信号对应事件,信号默认处理操作
可以使用下面命令查看

man 7 signal 

在这里插入图片描述

常用信号

SIGHUP:1号信号,Hangup detected on controlling terminal or death of controlling process(在控制终端上挂起信号,或让进程结束),ation:term

SIGINT:2号信号,Interrupt from keyboard(键盘输入中断,ctrl + c ),action:term

SIGQUIT:3号信号,Quit from keyboard(键盘输入退出,ctrl+ | ),action:core,产生core dump>>文件

SIGABRT:6号信号,Abort signal from abort(3)(非正常终止,double free),action:core

SIGKILL:9号信号,Kill signal(杀死进程信号),action:term,该信号不能被阻塞、忽略、自定义处理

SIGSEGV:11号信号,Invalid memory reference(无效的内存引用,解引用空指针、内存越界访问),action:core

SIGPIPE:13号信号,Broken pipe: write to pipe with no readers(管道中止: 写入无人读取的管道,会导致管道破裂),action:term

SIGCHLD:17号信号,Child stopped or terminated(子进程发送给父进程的信号,但该信号为忽略处理的)

SIGSTOP:19号信号,Stop process(停止进程),action:stop

SIGTSTP:20号信号,Stop typed at terminal(终端上发出的停止信号,ctrl + z),action:stop

具体的信号采取的动作和详细信息可查看:man 7 signal

kill函数/信号产生

kill命令产生信号:kill -SIGKILL pid

kill函数:给指定的进程发送指定信号(一定不杀死)

  int kill(pid_t pid, int sig);

成功:0
失败:-1
非法,普通用户杀死init进程等权级问题,设置error

pid>0:发送信号给指定进程
pid = 0:发送信号给与调用kill函数进程属于同一进程组的所有进程
pid<0&&pid!=-1:取 |pid| 发送给对应进程组
pid = -1:发送给进程有权限发送的系统中所有权限

eg:

#include
#include
#include
#include
#include
#include
#include
int main()
{
    
    pid_t pid=fork();
    if(pid<0)
    {
    
        perror("fork");
        exit(1);
    }
    else  if(pid==0)//子进程
    {
    
        printf("child pid = %d ,ppid = %d\n",getpid(),getppid());
        sleep(2);
        kill(getppid(),SIGKILL);
    }
    else//父进程
    {
    
        printf("parent pid = %d\n",getpid());
        while(1);
    }

    return 0;
}

结果:
在这里插入图片描述

相关文章
|
8月前
|
存储 缓存 前端开发
如何使用 CacheStorage 实现离线缓存
CacheStorage 是一种在客户端存储数据的 API,适用于 Service Worker。通过它,可以实现网页资源的离线缓存,提高应用加载速度和用户体验。使用时,先打开缓存,然后添加、获取或删除资源,确保应用即使在网络不可用时也能正常运行。
|
SQL 存储 数据库
SQL数据开发
SQL数据开发
|
区块链 供应链 安全
现货合约跟单交易所系统开发(成熟源码)|秒合约系统搭建案例
智能合约和去中心化应用的发展一直在逐步推进
|
消息中间件 存储 Kafka
高吞吐量分布式消息系统:深入了解 Apache Kafka
在现代的分布式系统中,消息传递已经成为实现异步通信、日志记录和事件驱动架构的核心。Apache Kafka,作为一款高吞吐量、持久性和分布式的消息系统,正被越来越多的企业和开发者用于构建实时数据流和事件处理平台。本文将为您详细介绍 Apache Kafka 的核心概念、特性以及在分布式架构中的应用。
268 0
|
缓存 JavaScript 前端开发
理解React中Fiber架构(二)
自从React16版本更新了Hook用法,同时引入了新的Fiber架构去重构整个渲染和事件处理过程,React团队引入Hook是为了更好剥离业务代码,让开发能更加友好的抽象代码,达到低耦合的函数组件目的,那么重构Diff算法,引入Fiber架构是为了什么呢? 其实只是为了能够一个目标快速响应,原先Diff算法时间复杂度为O(n3) O(n^3)O(n3) ,最后经过Fiber重构达到了O(n)O(n)O(n),这里面具体有什么门道,值得我们去深入研究一下。
615 0
|
网络协议 安全 Linux
ssh端口转发(跳板机)详解
如果在工作环境中,被防火墙限制了一些网络端口的使用,但是允许SSH的连接,也能够将通过ssh端口转发来进行通讯。
5196 1
ssh端口转发(跳板机)详解
|
弹性计算 数据库
ECS使用有感
我是一名即将步入社会的大学生,随着网络法等相关专业知识的学习愈发强烈。查询资料时,常常会浏览到制作精美的个人站,因此产生了建设自己个人站的设想,但是由于业余时间少之甚少,同时听闻购买域名与服务器的价格不菲,因此计划一直未能实现
|
API Python
【带你成为pyq最靓的仔】朋友圈九宫格(一)之图片切割篇
既然能够对图片进行九宫格化操作,那么视频是不是也可以呢?答案是肯定的,关于对视频进行九宫格化的操作我将在本系列推文的第二篇进行讲解
【带你成为pyq最靓的仔】朋友圈九宫格(一)之图片切割篇
|
新零售
独家下载!《零售数据中台通关指南》,带你玩转新零售
阿里CIO学堂独家出品,零售课程实录公开。《零售数据中台通关指南》来啦!速度来pick。
396 0
独家下载!《零售数据中台通关指南》,带你玩转新零售