当前位置: 首页 > news >正文

IPC 信号-Signal Linux环境

IPC---Inter-Process Communication

Linux系统支持进程间通信大体分为三类:

  1. 共享存储类:不能独立使用,必须配合并发控制机制一起使用

    1> 共享外存:借助于外存中的普通文件 (由于外存的访问速度比较慢,这种方式不被推荐使用)

    2> 共享内存

  2. 消息传递类

    1> 信号

    2> 管道

    3> socket ----- 见网络编程

    4> 消息队列

  3. 并发控制类

    1> 信号量集合


    信号-Signal

一种通知进程系统当前有某种状况发生的机制

老版Linux支持32个信号,新版Linux新增了32个信号

Linux给每个信号进行了从0开始的编号,老版32个信号的编号为:0到31,新增的32个信号的编号为:32到63

为了在代码中更好地利用这些信号,Linux在相关头文件中为每个信号用宏定义的形式“起了一个名字”,诸如:SIGCHLD

编号为0的信号称为空信号

命令:kill -l 可以查看所有信号

常用信号与其对应状况:-----了解2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-/)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。6) SIGABRT
调用abort函数生成的信号9) SIGKILL
用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号10) SIGUSR1
留给用户使用11) SIGSEGV
试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.12) SIGUSR2
留给用户使用14) SIGALRM
时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号15) SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。
如果进程终止不了,我们才会尝试SIGKILL17) SIGCHLD
子进程结束时, 父进程会收到这个信号。
如果父进程没有处理这个信号(对该信号采用系统默认行为),也没有等待(wait)子进程,子进程虽然终止,
但是还会在内核进程表中占有表项(未被释放的资源),这时的子进程称为僵尸进程。18) SIGCONT
让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作.19) SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略

发送信号的命令:

kill 进程id ------ 向指定进程发送15号信号

kill -信号编号 进程id

kill -不含SIG的信号名 进程id

killall 进程名

killall -信号编号 进程名

killall -不含SIG的信号名 进程名


收到信号的进程,对信号的响应方式:

1) 采取系统默认行为

        1> 杀死进程 2> 暂停进程 3> 恢复继续运行进程 4> 忽略

2) 忽略
3) 调用程序设置的处理函数

1. 信号函数

发送信号的函数:kill


e.g.

新建标签页,先把 signal 跑起来

使用 ps -aux 查看进程号为8453

连续使用两次该命令 ,即向 进程号为 8453 的进程发送 2 号信号

切换到上一个标签页,发现确实被调用了两次


调用killall 命令 ,发送 9 号信号,杀死全部的 signal 进程

再调用ps -aux 命令发现确实被杀死了


设置指定信号的处理方式:signal


e.g.

键盘输入 ctrl + C 输入 2 号信号(让程序退出)


当我们自己写一个传入 2 号信号的函数:

此时再输入 ctrl + C 就会打印我们函数里的内容,不会退出。


某进程中在第一次fork前进行如下调用:signal(SIGCHLD,SIG_IGN); 表示所有子进程的善后由系统自动完成

信号处理函数的调用时机:

编号为 0~31 的信号:采用第一种方案,因此这些信号可能在这种情况下丢失。因此这些信号被称为:不可靠信号(非实时信号)

编号为 32~63 的信号:采用第二种方案,因此这些信号无论什么情况都不会丢失。因此这些信号被称为:可靠信号(实时信号)

由于常用的是老版Linux支持的前32个信号,因此实际项目中并不建议使用信号作为进程间通信的手段

2. 其它与信号相关的函数

alarm

void abort():立即向调用进程发送信号 SIGABRT


3. 信号与函数阻塞

基本上所有会引起阻塞的函数,都会让调用进程陷入浅度睡眠,唤醒方式就有两种:

  1. 资源就位(期望某个条件成立)
  2. 收到信号

对于这些函数本身的功能而言认为信号导致的返回是错误,错误编号是 EINTR

但对于很多应用程序的逻辑而言这种由信号引发的错误应该被忽略,不应该将其视为真正错误,因此对于这些阻塞型建议采用类似于如下的处理方式:

int ret = 0;
ret = sys_func(.....);//阻塞型函数
while(ret < 0){if(errno == EINTR){//说明sys_func的本次阻塞后返回是由信号引发的ret = sys_func(.....);continue;}else{出错处理break;}
}
....//或者while(1){ret = sys_func(.....);//阻塞型函数if(ret < 0){if(errno == EINTR){//说明sys_func的本次阻塞后返回是由信号引发的continue;}else{出错处理break;}}
}
.....


http://www.mrgr.cn/news/57302.html

相关文章:

  • [Ansible实践笔记]自动化运维工具Ansible(一):初探ansibleansible的点对点模式
  • 7. 配置
  • The Open Group 2024年度大会大咖来袭
  • ETLCloud搭配MySQL | 让关系型数据库更智能
  • vue项目-img 标签的 error 事件
  • Turn-it:优化线材重构雕塑制造
  • 栈的顺序存储总览
  • 关于风险系统解读最全最专业文章:一篇文章讲透风险,跨学科搞懂风险游戏规则,风险信任风险主观性客观性风险本质人格特质与风险态度技术风险系统风险社会新产品风险
  • 栈和队列代码
  • ARM/Linux嵌入式面经(五二):华为
  • Spring 设计模式之单例模式
  • C++新基础类型(C++11~C++20)
  • ECharts图表图例11
  • 解决cad找不到vcruntime140_1.dll,无法继续执行代码的6种方法
  • 《YOLO 目标检测》—— YOLO v3 详细介绍
  • 拟态UI3.0个人页
  • django模板相关配置
  • 一个将.Geojson文件转成shapefile和kml文件的在线页面工具(续)
  • hive数据库,表操作
  • 前缀和 有图文 超详细整理通俗易懂
  • OpenEular + KVM + virt-manager 笔记
  • Python小程序 - 替换文件内容
  • 论文精读:TiC-CLIP: Continual Training of CLIP Models(三)
  • pdf表格读取和筛选
  • ArrayList 源码分析
  • 论文精读:TiC-CLIP: Continual Training of CLIP Models(二)