信号

本文深入探讨了信号在操作系统中的作用及其对进程的影响,包括信号的定义、响应方式、发送类型,以及同步与异步执行的概念。详细解析了kill函数的使用方法,展示了如何通过信号实现进程间的通信。

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

信号:系统定义好的某些特定事件,事件可以被产生,也可以被接收,产生和接收事件的主体都是进程。

信号的响应方式(进程接收后如何处理):忽略、 默认、 自定义(捕获)
SIG_DFL SIG_IGN

修改信号响应方式
typedef void(*Fun)(int);
Fun signal(int signum, Fun fun);//注册函数
发送信号类型:sigint SIGINT
sigchld SIGCHLD

异步执行:两个以上的进程或者线程,执行互不影响,同时向下执行,当需要其他进程的某些执行条件时,不需等待,仍继续处理后续工作,当某个时刻,其他进程或线程完成所需的某种条件时,会通过系统机制通知该进程或线程,在处理之前的请求。

同步执行:两个或两个以上进程(或线程),其中一个进程或线程的执行需要依赖其他进程或线程的执行条件。会不停的探测,直到其他进程完成其执行条件。

阻塞:进程在运行的过程中缺少某种条件而被挂起等待。

非阻塞:进程在运行过程中缺少某种条件不停止运行一直做其他的事直到该条件满足。

同步异步指两个进程之间的关系,而阻塞非阻塞是指一个进程本身的状态

信号的发送:int kill( pid_t pid , int sigtype); //系统调用函数
将信号发送给哪个进程 发送的信号类型

Pid > 0 指定接收信号的进程的PID
Pid == 0 将信号发送给当前进程组中所有的进程
Pid == -1 将信号发送给系统上所有的进程(有权限发送)
Pid < -1 将信号发送给进程组ID为-PID组内所有的进程

每个进程属于一个进程组,进程组有进程组组长,进程组组长的PID为进程组ID。
进程组:是一个或多个进程的集合,每一个进程组有一个唯一的进程组ID。 会话:是一个或多个进程组的集合。

kill(1234,SIGINT); ====> SIGINT == 2 (SIGINT信号的值为2,ctrl c触发)
| 通过用户态切换内核态一系列操作调用底层的一个函数
sys_kill(1234,2); 0.11版本

在这里插入图片描述
在这里插入图片描述
struct task_struct 是进程PCB的结构体,定义了一个二级指针,NR_TASKS的值是64
task 是进程表,0.11版本系统维护进程的PCB时是用存放指针的数组来维护的。
在这里插入图片描述
NR_TASKS是该数组的大小,
struct task_struct **p = NR_TASKS + task;此时该指针P指向数组的最后一个位置。
if判断,当PID为0时,下面代码就实现了信号发送给当前进程的进程组中所有进程,elseif PID>0时,是怎么样实现信号发送给指定接收信号的进程的,以及后面==-1时、< -1时都是怎么样实现对应状况的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值