Linux初识进程信号

预备

1,你怎么能认识信号呢?

信号是内置的,进程认识信号,是程序员内置的属性

2,信号产生之后,怎么处理信号?

知道!因为在信号产生之前,就已经把处理信号的内容准备好了。

3,处理信号,是立即处理吗?

我可能正在做我自己的事情,优先级很高,有时候信号并不一定立即处理,而是在合适的时候。

4,怎么处理信号?

a,默认行为

b,忽略信号

c,自定义动作

信号产生

1,键盘产生

我们用一个死循环的代码来讲解:

这时终端会不断的向屏幕打印内容,直接./运行的程序属于前台进程,当想在此进程运行时输入诸如ls之类的指令时无法运行:

我们还知道,当我们输入CTRL+c时会退出程序运行,这时候才能输入命令:

我们输入CTRL + c的动作就是给前台进程发信号让进程停止运行。

这时我们让进程进入后台运行:在./ 后面加上取地址符号:

这时前台进程空出,bash进程可与进行命令行解释:

那么怎么关后台进程?

1,用ps jax | grep + 进程名查进程pid:

用指令:kill -9 +进程id:

2,nohup方法:

用指令:nohup + ./test + &

可以看到,文件夹中多列一个nohup文件,cat此文件时会看到文件内有进程打印到屏幕中的内容.

这时我们看到nohup时下面有个数字1,然后用fg指令加这个1可以把进程拉到前台然后CTRL+C:

可以看到,进程被关闭:

3,常见信号:

可以看到系统提供了这么多种信号,其中1号到31号常用,34-64为时实信号,不做讲解.

其中,2号信号就是我们从键盘中输入ctrl +c时给进程发送的信号:

为了测试这个结论,我们要学习一个系统调用接口:signal

此函数可以让我们实现信号捕捉/自定义,signum代表信号,handler代表当此信号触发时运行此函数:

我们可以去man 7手册中查看各自信号代表什么含义:

其中,ctrl +\ == 三号信号,也是可以停止进程:

这时我们可以用ctrl + \来停止:

那如果,我们将所有信号都包装了那岂不是进程就无法关闭了?

起始在1到31个信号中,有一个信号最为特殊,就是九号信号,此信号无法被封装:

我们如何在软件层面理解信号处理:

键盘把组合键给到os,再有os传给进程,那么如何记录信号?

位图!

比特位为信号的编号,比特位的内容为0/1表示是否受到信号

所以发送信号的本质就是写入信号,os'修改目标进程的pcb中信号位图由0变1;

无论以什么方式发信号,最终都转换到os,让os写入信号,所以进程的唯一管理者是os

我们如何在硬件出卖你理解信号:

os怎么知道键盘上面由数据?

在硬件设备中纯在着一个中央处理器,平时os都不会对键盘的信息做读取,但是当键盘由内容输入且传输的时候,中央处理器会接收到来自键盘的信号,知道有外设的数据已经准备好了,然后再告诉操作系统从外设中读取数据,这个过程我们叫做中断,

信号为纯软件,模拟信号中断.

有了以上知识的铺垫,我们可以来学习一些代码中的系统调用接口:

kill:

其中,pid指的是需要传入信号的进程pid,sig指的是传几号信号.

raise:给自己传信号:

abort:给自己调用六号信号(kill(getpid(),6);

alarm:可以设置多少秒的闹钟,默认闹钟结束行为为中止进程,给进程发送SIGALRM信号.

alarm(0)为取消闹钟,然后返回闹钟剩余时间.

2,软件条件

在之前的文章中我们知道,alarm可在进程中设置闹钟让进程在一定时间后收到某信号执行信号内容,这种方式就是属于软件条件产生信号.

所以我们现在知道的五种信号产生方式:

1,键盘

2,指令,

3,系统调用,

4,软件条件

5,异常(下面重点讲)

异常

当系统发现段错误的时候,会给os发送11号信号让进程停止运行

c/c++中常见的异常机就是进程崩了,然后告诉os然后os发信号给进程

那么os怎么知道进程内出错了?为什么当我们把11号信号自定义之后会出现死循环的情况:

其实我们的程序错误,都会体现在硬件上:

在cpu中有一个Eflags硬件,其中有一个标志位代表着是否会越界的问题,当此标记为为1时,cpu会返回给os告诉os这个进程出错了,然后os会给进程发送11号信号,但是在上面代码中,我们把11号信号自定义了,所以程序还会继续跑,继续跑继续发现错误然后继续防窥如此循环:

当发生除零错误时,cpu中还有一个硬件叫MMU,当除法位数超过MMU标记为时也会返回给操作系统然后同上(除零错误返回八号信号)

其他问题:

在man 7 手册中会看到有一栏:

term和core代表什么意思?

Trem代表正常退出,不做其他处理.

core会在当前目录形成一个文件:pid.core,在进程奔溃的时候将进程中部分信息保存下来方便调试,云服务器一般都是默认关闭这个功能,因为一旦出错可能会无限创建core文件导致磁盘塞满会引发其他问题.

可以用ulimit查看:

可以看到,core部分为0 这时候可以用指令打开:

关闭值为零就行;

这时运行就会产生core文件.

编译时带-g,

gdb+进程名

输入core-file core就可以定位到错误的地方:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何安全删除 Linux 用户帐户和主目录 ?

Linux 以其健壮性和灵活性而闻名,是全球服务器和桌面的首选。管理用户帐户是系统管理的一个基本方面,包括创建、修改和删除用户帐户及其相关数据。本指南全面概述了如何在 Linux 中安全地删除用户帐户及其主目录,以确保系统的安全性和完整性。…

ubuntu16.04在ros使用USB摄像头-解决could not open /dev/video0问题

首先检查摄像头 lsusb 安装 uvc camera 功能包 sudo apt-get install ros-indigo-uvc-camera 安装 image 相关功能包 sudo apt-get install ros-kinetic-image-* sudo apt-get install ros-kinetic-rqt-image-view运行 uvc_camera 节点 首先输入roscore 然后另外开一个终端输入…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中,如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台,将聚水潭的数据无缝集成到MySQL数据库中,实现从“聚水谭…

Kafka日志索引详解以及生产常见问题分析与总结

文章目录 一、Kafka的Log日志梳理1.1、Topic下的消息如何存储1.1.1、log文件追加记录所有消息1.1.2、index和timeindex加速读取log消息日志 1.2、文件清理机制1.2.1、如何判断哪些日志文件过期了1.2.2、过期的日志文件如何处理 1.3、Kafka的文件高效读写机制1.3.1、Kafka的文件…

数据结构 (5)栈

一、基本概念 栈是一种运算受限的线性表,它只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),而另一端则被称为栈底(Bottom)。栈的插入操作被称为入栈(Push)&a…

AI 在软件开发流程中的优势、挑战及应对策略

AI 在软件开发流程中的优势、挑战及应对策略 随着人工智能技术的飞速发展,AI大模型正在逐步渗透到软件开发的各个环节,从代码自动生成到智能测试,AI的应用正在重塑传统的软件开发流程。本篇文章将分析AI在软件开发流程中带来的优势&#xff0…

2025-2026财年美国CISA国际战略规划(下)

文章目录 前言四、加强综合网络防御(一)与合作伙伴共同实施网络防御,降低集体风险推动措施有效性衡量 (二)大规模推动标准和安全,以提高网络安全推动措施有效性衡量 (三)提高主要合作…

hubuctf-2024校赛-复现wp

web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…

[AutoSar]BSW_Diagnostic_007 BootLoader 跳转及APP OR boot response 实现

目录 关键词平台说明背景一、Process Jump to Bootloader二、相关函数和配置2.1 Dcm_GetProgConditions()2.2 Dcm_SetProgConditions() 三、如何实现在APP 还是BOOT 中对10 02服务响应3.1 配置3.2 code 四、报文五、小结 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagno…

Linux命令思维导图

看到一个很不错的Linux命令思维导图&#xff0c;用机器翻译了一下&#xff0c;建议收藏备用。 附上英文版&#xff1a;

vmware esxi vcenter6.7安装教程(dell)以及许可证

背景 vSphere是数据中心产品附带的软件套件&#xff0c;vSphere就像是Microsoft Office套件一样&#xff0c;其中包含许多软件&#xff0c;例如PPT、Word、Excle等&#xff0c;同理&#xff0c;vSphere也是一个软件套装&#xff0c;其中包含vCenter、ESXi、vSphere Client等&a…

springboot实战(17)(“大事件“——新增文章主体逻辑)

目录 一、新增文章涉及的数据表、实体类。 &#xff08;1&#xff09;表结构。 &#xff08;2&#xff09;实体类&#xff08;Article&#xff09; 二、接口文档分析。 &#xff08;1&#xff09;请求方式与请求路径。 &#xff08;2&#xff09;请求参数。 &#xff08;3&…

Vue小项目(开发一个购物车)

基于Vue知识点1&#xff08;点击跳转&#xff09;、Vue知识点2&#xff08;点击跳转&#xff09; ​想要学习更多前端知识&#xff1a;点击Web前端专栏 接下来我们开发一个如下图所示&#xff0c;有最基本购物车功能的简易小项目 下面这是最基本的HTMLCSS框架&#xff01;&…

Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件

不使用 deep 要想修改三方组件样式&#xff0c;只能添加到 scoped 之外&#xff0c;弊端是污染了全局样式&#xff0c;后续可能出现样式冲突。 <style lang"less"> .container {.el-button {background: #777; } }使用 /deep/ deprecated .container1 {/deep…

禁用达梦DEM的agent

agent占用内存较多&#xff0c;实际没什么使用&#xff0c;考虑停止agent 应该切换到root执行停止 cd /dm/dmdbms/tool/dmagent/service/ ./DmAgentService stop禁用

多维高斯分布的信息熵和KL散度计算

多维高斯分布是一种特殊的多维随机分布&#xff0c;应用非常广泛&#xff0c;很多现实问题的原始特征分布都可以看作多维高斯分布。本文以数据特征服从多维高斯分布的多分类任务这一理想场景为例&#xff0c;从理论层面分析数据特征和分类问题难度的关系注意&#xff0c;本文分…

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术&#xff0c;选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发&#xff0c;搭载了先进的勘智 K230D 芯片。 K230…

RocketMQ: Producer与Consumer 最佳实践

Producer 1 &#xff09;发送消息注意事项 1.1 一个应用尽可能用一个 Topic&#xff0c;消息子类型用 tags 来标识&#xff0c;tags 可以由应用自由设置。只有发送消息设置了tags&#xff0c;消费方在订阅消息时&#xff0c;才可以利用 tags 在 broker 做消息过滤 message.setT…