Linux 信号

本文详细介绍了Linux信号机制,包括信号的认识、产生、处理和在内核中的表示。通过信号,操作系统可以中断进程的正常控制流程。信号可以由按键、系统函数、软件条件或硬件异常产生,进程可以设置信号的处理方式,如忽略、执行默认处理或自定义处理函数。信号在内核中有阻塞和未决两种状态,并通过信号集进行管理。文章还详细讨论了信号处理函数,如`signal`和`sigaction`,以及信号在递达过程中的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、认识信号

信号是一种通知机制。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

使用命令
kill -l 查看系统的信号列表
在这里插入图片描述
每个信号都有一个编号和一个宏定义名称,这些宏定义可以在 signal.h 中找到例如:

 #define SIGINT 2

编号34以上的是实时信号,本文讨论编号34以下的信号。

二、产生信号

1.通过按键产生信号

SIGINT(Ctrl+C 组合键)的默认处理动作是终止进程
SIGQUIT(Ctrl+\ 组合键)的默认处理动作是终止进程并且Core Dump

例如,使用Ctrl+C组合键可以生成SIGINT信号,在计时器过期之前按Ctrl+C组合键,可以使sleep命令提前终止;
Ctrl+Z组合键生成SIGSTP信号,可以停止任何在shell中运行的进程。
停止进程与终止进程不同,停止进程后程序任然留在内存中,能够从停止的地方继续运行。

2.调用系统函数向进程发信号
写一个死循环程序并运行
在这里插入图片描述
在这里插入图片描述
用kill命令给它发SIGSEGV信号:
在这里插入图片描述

在这里插入图片描述
以往遇到的段错误都是由非法内存访问产生的,而这个程序本身没错,给它发SIGSEGV也能产生段错误

kill命令是调用kill函数实现的。kill函数可以给一个指定的进程发送指定的信号。
raise函数可以给当前进程发送指定的信号(自己给自己发信号)

#include <signal.h>

int kill(pid_t pid, int signo);
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇dyl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值