返回顶部
首页 > 资讯 > 操作系统 >【Linux】进程信号(上)
  • 711
分享到

【Linux】进程信号(上)

linux运维服务器 2023-08-20 10:08:40 711人浏览 薄情痞子
摘要

文章目录 1.信号概念理解信号产生信号保存信号处理 2. 信号的产生证明输入 CTRL C 就是向前台进程发送信号signal 函数内部参数传递的理解对于信号自定义动作的捕捉问题 3.信号产生的方式1.从键盘输入2.使用

1.信号概念理解

信号产生

什么叫做信号呢?
生活当中认为是信号的是:红绿灯 闹钟 下课铃 鸡叫 手势


1.当红灯亮的时候, 你会停下来 即匹配的动作
那为什么会有这个匹配动作呢?
因为曾经有人培养过你
所以信号没有被产生,也知道怎么该处理它


2.我们能够认识并处理一个信号,是能因为识别这个信号的

若进程就是我,信号就是一个数字,进程在没有接收信号的时候,它早就知道一个信号该如何处理了
程序员在设计进程的时候,早就已经设计了对信号的识别能力


3.因为信号可能随时产生,所以在信号产生前,我可能正在做优先级更高的事情,我可能不能立马处理信号
要在后续合适的时候进行处理

如:你点了一份外卖,因为你不确定外卖什么时候到,所以开了一把游戏,当外卖小哥给你打电话说外卖到了时,游戏还没打完,所以你跟外卖小哥说等一会,马上到,然后继续打游戏,直到游戏打完,才去取外卖

信号保存


在信号产生和信号处理之间,存在时间窗口,因为没办法直接处理,需要等待后续处理
在时间窗口期间,需要被保存起来

进程收到信号的时候,如果没有立马处理这个信号,需要进程具有记录信号的能力


信号的产生对于进程来讲是异步的

异步为两者互相做自己的事,互不干扰
如:你正在上课,外卖小哥给你打电话告诉你快递到了,因为快递有重要的东西,所以你不得不现在去取,但是在你取快递的过程中,依旧在上课,上课与你取快递两件事情互不干扰


进程该如何记录对应产生的信号?记录在哪里?

可能同时收到很多信号,已经被产生但尚未处理,所以需要在时间窗口内,将这些信号保存,同时也应该将其进行管理
而管理的本质是先描述,在组织
那如何描述一个信号呢? 用什么数据结构管理这个信号呢?


输入 kill -l 查看信号列表

可以发现在31 和34之间没有信号存在,说明信号被划分为两部分,1-31以及34-64
34-64称之为实时信号,
1-31称之为普通信号,是目前要学习的信号
数字实际上是真正的信号,而大写的名称是宏


实时操作系统
当前主流的操作系统分为实时和分时,
分时像linuxwindows操作系统,基于时间片操作器调度的,强调的是公平调度
实时 像汽车的车载系统的辅助驾驶
特点为若来一个任务,就必须优先级较高的将该任务立马处理,强调的是高响应
普通信号 ,只保存有无产生,只需在合适的时候处理信号即可


可以通过0代表没有产生,1代表产生
1-31刚好是32个比特位,所以使用位图结构管理信号
而进程使用task_struct(PCB) 内部必定要存在一个位图结构,用int表示

从低到高的比特位,依次对应1-31 信号
发送信号的本质是写入信号,直接修改特定进程的信号位图中的特定比特位,0变成1即可
比特位的位置,称之为信号的编号
比特位的内容,表示是否收到该信号

信号处理

默认处理信号的方式:
1.默认动作
2.忽略信号
3.用户自定义动作

如:拿到快递,共有三种选择
1.执行默认动作把快递打开 2.忽略快递 3. 执行自定义动作(如快递内是零食,送给你的女朋友)

2. 信号的产生

vscode中,创建makefile文件

mysignal:mysignal.cc    g++ -o $@ $^.PHONY:cleanclean:    rm -f mysignal

创建 mysignal.cc(以cc结尾是cpp) 文件
会一直循环打印一句话,并当前进程的包含pid值

#include#includeusing namespace std;int main(){   while(true)   {    cout<<"我是一个进程,我正在运行...,pid值:"<

复制ssh渠道创建终端2,在保证运行终端1的可执行程序的情况下,
在终端2中输入 kill -9 +pid值 ,终止了终端1中运行的程序

在这里插入图片描述


实际上 在键盘中输入 CTRL C ,终止运行程序,本质也是向对前台进程发送信号


Linux通过远程终端访问时,只允许一个进程处于前台,默认情况是bash,
所以在自己的程序运行时输入指令没有任何反应

证明输入 CTRL C 就是向前台进程发送信号

输入 man 2 signal 指令

第二个是一个函数指针 将 void(*) (int) typedef 命名为 sighandler_t
signal 函数的第一个参数 是 signsum 代表信号编号
第二个参数 是 handler 代表哪一个进程调用了signal,使指定信号不在执行默认动作,而是执行该函数指针指向的方法


输入 CTRL C 相当于发送 2号信号

修改 mysignal.cc文件内容,并运行程序 发现输入 CTRL C 指令无法结束程序

在这里插入图片描述


在这里插入图片描述
同样在终端2中输入 kill -2 pid值,也无法结束运行程序

说明对于2号信号 ,进程的默认方法是终止进程
signal 可以进行对指定动作的信号设定自定义处理动作


signal 函数内部参数传递的理解

当signal(2,handler)调用完这个函数时, handler方法没有被调用,只是发生了回调
handler作为函数的地址传过去 作为参数被函数指针接收,再通过函数指针找到handler函数 完成调用
在操作系统内部,把对应的自定义方法的地址保存起来了


handler方法什么时候被调用?
当2号信号产生的时候
如: 你小时候总喜欢在家里调皮,你老爸不管你,认为这是很正常的事情,所以你认为这是默认动作,但是你的老妈看见你调皮,就告诉你说如果下次再看见你调皮,就揍你,
所以再有调皮捣蛋事情发生,不会像你老爸那样什么都不管,你老妈会揍你
是在下次调皮发生的时候,才揍你

对于信号自定义动作的捕捉问题

默认对2号信号的处理动作:终止进程
输入 man 7 signal 指令

2号信号的动作是 Term(终止)
用signal(2,handler),是在执行用户动作的自定义捕捉


CTRL \ 代表3号信号 ,此时虽然2号信号被置为自定义动作了,但是三号信号还没有,所以依旧能终止进程


修改mysignal.cc文件内容,加入对于3号信号的自定义动作


再次运行可执行程序时,发现使用CTRL \ 也会调用自定义动作


可以给所有信号设置同一个处理函数


若修改mysignal.cc文件内容,将1-31的所有普通信号都进行自定义动作捕捉


在这里插入图片描述

可当运行可执行程序时,在终端2中使用 kill -9 pid值 方式依旧可以干掉进程

9号信号被称为管理员信号,不可被自定义,只能执行默认动作

3.信号产生的方式

1.从键盘输入

在输入的时候,计算机怎么知道从键盘输入数据了呢?
键盘是通过硬件中断的方式,通知系统键盘已经按下了


在这里插入图片描述
CPU存在很多针脚,有自己的编号,接到主板上
键盘是通过中断控制器(如8259)连接到CPU的,
当按键盘中的某个位置时,操作系统要知道是哪个设备按下的(磁盘 键盘 网卡)
键盘通过中断控制器链接到9号阵脚处,触发中断
而从这个阵脚的数字被叫做 中断号

CPU内部有各种寄存器,当阵脚有数字时已经就绪时,向CPU寄存器的内部写数字
就完成了硬件中断


操作系统内维护一张中断向量表
中断向量表内部包含函数指针
中断号作为中断向量表的下标,直接调用中断向量表中对应的方法
而这个方法会从键盘中读取数据

2.使用系统调用向进程发送信号

kill

输入 man 2 kill 指令

第一个参数为目标进程
第二个参数为信号
向目标进程(pid)发送对应的信号(sig)
成功返回0,失败返回-1


命令行参数
main函数的两个参数,char* argv[] 为指针数组 ,argv为一张表,包含一个个指针,指针指向字符串
int arGC,argc为数组的元素个数


创建mykill.cc文件


当输入./mykill时,由于有命令行参数的存在,将其放入数组下标为0的位置中,同时数组个数为0
所以进入自定义的用户手册


修改mykill.cc文件内容

c由于agrv是字符指针数组,而我们想要的目标进程和信号编号都是数字,所以需要使用atoi函数,将字符串转化为整数


创建loop.cc文件


运行loop.cc与mykill.cc文件,形成可执行程序

在这里插入图片描述
在终端1中运行loop
在终端2中运行输入 ./mykill 9 对应进程的pid值
9为进程编号 pid值为目标进程
输入loop进程的pid值,从而使用9号信号结束loop进程

raise

输入 man raise 指令

谁调用raise,就给谁发指定的信号


修改mykill.cc文件内容


再去调用可执行程序mykill时,自己就结束了,因为自己给自己发送2号信号

abort

输入 man abort 指令

给自己发信号


再次修改mykill.cc文件内容


没有end存在,说明当前进程自己把自己干掉了


通过添加signal的方式,若运行mykill,自动生成get a signal :6
说明使用 Aborted时使用6号信号


而在实际运行时,会自动生成get a signal :6 ,说明实际上Aborted是使用6号信号

3.由软件条件产生信号

alarm函数可以设定一个未来时间
如:alarm(5) alarm函数调用完了,5秒后给当前进程发送SIGALRM(14)信号,该信号的默认动作是终止当前进程


alarm函数返回值是0或者以前设定的时间还余下的秒数
假设你想睡一觉,设定闹钟30分钟后响,但是在20分钟后你被吵醒了,你又重新设置闹钟15分钟后响
此时返回值就是上一次余下的10分钟


修改mykill.cc文件内容

计算1S中计算机会将整数累计到多少


在这次计算中,count只有11万多,非常不符合我们的预期
因为要打印到显示器上,以及网络问题,非常拖延速度


修改count为全局变量,在发送信号时,自定义方法中输出count值

这时count的值就变成5亿多
两者相比之下,说明io效率非常底下

来源地址:https://blog.csdn.net/qq_62939852/article/details/130374340

--结束END--

本文标题: 【Linux】进程信号(上)

本文链接: https://www.lsjlt.com/news/376383.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Linux】进程信号(上)
    文章目录 1.信号概念理解信号产生信号保存信号处理 2. 信号的产生证明输入 CTRL C 就是向前台进程发送信号signal 函数内部参数传递的理解对于信号自定义动作的捕捉问题 3.信号产生的方式1.从键盘输入2.使用...
    99+
    2023-08-20
    linux 运维 服务器
  • 【Linux】进程信号万字详解(上)
    🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日...
    99+
    2023-08-31
    linux 运维 服务器
  • Linux--进程信号
    前言         无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事情,而不是让烦恼和焦虑毁掉你不就不多的热情和定力。心可以碎,手不能停,该干什么干什么,在崩溃中继续努力前行,这才是一个成年人的素养。           ...
    99+
    2023-08-31
    linux 运维 服务器
  • Linux进程信号
    文章目录 信号入门什么是linux信号?信号处理的常见方式查看系统定义的信号列表 产生信号通过终端按键产生信号调用系统函数向进程发送信号由软件条件产生信号硬件异常产生信号 阻塞信号阻塞...
    99+
    2023-09-06
    信号处理 信息与通信 linux 搜索引擎 gitee
  • 【Linux】进程信号
    ​🌠 作者:@阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们...
    99+
    2023-09-12
    linux 运维 服务器 进程信号
  • 【linux】进程信号——信号的保存和处理
    文章目录 一、阻塞信号1.1 信号的相关概念1.2 在内核中的构成 二、捕捉信号概念2.1 内核态和用户态2.2 信号捕捉流程图 三、信号操作3.1 sigset_t信号集3.2 信号集操作函数3.2.1 更改block表s...
    99+
    2023-08-20
    linux 运维 服务器
  • Linux-进程间通信
    进程间通信 进程间通信介绍进程间通信目的进程间通信发展进程间通信分类 管道匿名管道匿名管道特点匿名管道读写规则 命名管道创建一个命名管道命名管道的打开规则用命名管道实现server&client通信 system...
    99+
    2023-08-19
    linux 服务器 网络 c++ C语言
  • 【Linux】进程间通信
    目录 1. 进程间通信 1.1. 进程间通信的目的 1.2. 如何实现进程间通信 2. 管道通信 2.1. 匿名管道 2.1.1 创建匿名管道 2.1.2 . 深入理解匿名管道 2.2. 命名管道 2.2.1. 创建命名管道 3. sys...
    99+
    2023-10-26
    linux 运维 服务器 操作系统 进程间通信
  • Linux——进程概念(上)
    文章目录 1. 冯诺依曼体系结构2. 操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 如何理解 "管理"2.4 总结2.5 系统调用和库函数概念 3. ...
    99+
    2023-09-17
    linux 运维 服务器
  • Linux进程概念(上)
    Linux进程概念(上) 冯诺依曼体系结构操作系统(Operator System)概念设计OS的目的定位总结系统调用和库函数概念 进程基本概念描述进程-PCBtask_struct-PC...
    99+
    2023-09-13
    linux 运维 服务器
  • PHP进程信号如何处理
    这篇文章主要介绍“PHP进程信号如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP进程信号如何处理”文章能帮助大家解决问题。一、在Linux操作系统中有哪些信号1、简单介绍信号信号是事件发...
    99+
    2023-07-05
  • golang进程信号怎么处理
    在Go语言中,可以使用`os/signal`包来处理进程信号。下面是一个处理 `SIGINT` 和 `SIGTERM` 信号的示例代...
    99+
    2023-10-26
    golang
  • linux如何看oracle进程号
    可以使用如下命令来查看Oracle进程号:1. 使用`ps`命令查看所有正在运行的进程:```ps -ef | grep oracl...
    99+
    2023-08-23
    linux oracle
  • 简单了解php进程通信之信号量
    本篇文章给大家带来了关于PHP的相关知识,信号量又称为信号灯、旗语 用来解决进程(线程同步的问题),类似于一把锁,访问前获取锁(获取不到则等待),访问后释放锁,文中通过示例代码介绍的非常详细,希望对大家有帮助。(推荐教程:PHP视频教程)常...
    99+
    2024-04-02
  • php进程通信之信号量浅析介绍
    目录常见进程通信方式一些理论基础system V 信号量信号量类型php模拟多进程操作公共资源使用php封装system v 信号量集函数常见进程通信方式 一些理论基础 临界资源:...
    99+
    2024-04-02
  • linux如何查看进程号并杀死进程
    这篇文章给大家分享的是有关linux如何查看进程号并杀死进程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、...
    99+
    2023-06-15
  • Linux进程间如何通信
    这篇文章主要介绍“Linux进程间如何通信”,在日常操作中,相信很多人在Linux进程间如何通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux进程间如何通信”的疑惑...
    99+
    2024-04-02
  • 什么是Linux进程通信
    本篇内容主要讲解“什么是Linux进程通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Linux进程通信”吧!进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据...
    99+
    2023-06-09
  • 【Linux】进程间通信——管道
    文章目录 进程间通信1.1进程间通信介绍1.2进程间通信目的1.3进程间通信分类 管道2.1管道介绍2.2匿名管道pipe读写特征管道特征 2.3命名管道mkfifo创建管道文件删除管道文件通信 总结...
    99+
    2023-08-24
    linux 网络 运维 服务器
  • 如何在微信公众号上进行PHP开发
    如何在微信公众号上进行PHP开发微信公众号已经成为了一个非常受欢迎的社交平台,许多企业和个人都希望能够在微信公众号上进行开发,以吸引更多的用户和粉丝。PHP作为一种广泛使用的后端编程语言,也可以应用于微信公众号的开发中。本文将介绍如何使用P...
    99+
    2023-10-27
    指南 微信公众号 PHP开发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作