Linux进程的总结

本文围绕Linux信号展开,介绍了信号概念,区分软中断与硬中断;阐述信号产生方式,如终端按键、系统函数调用等;说明了信号处理的默认、忽略、自定义三种方式;对信号进行分类,包括可靠与不可靠、实时与非实时;还提及信号block、pending,以及可重入与不可重入函数。

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

1、信号概念:通知进程发生了某件事情,打断当前操作(属于软中断),去处理这个事件
        信号种类很多,每一个信号代表一个事件

软中断:由软件产生的中断操作/模拟硬中断的一种方式/由操作系统中一些命令产生的中断信号

硬中断:由外部硬件产生的中断操作

软中断与硬中断的区别:

软中断是执行中断指令产生的,而硬中断是由外设引发的。

硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。

硬中断是可屏蔽的,软中断不可屏蔽。

硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。

软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部
 

2、信号产生的方式:

        <1>通过终端按键产生信号(例:Ctrl+c)

       <2> 调用系统函数向进程发信号(例:kill命令)

       <3>由软件条件产生

       <4>由硬件异常产生

3、信号处理

            默认处理:    操作系统中既定义好的信号处理方式
            忽略处理:    nothing to do
            自定义处理:用户自己定义信号的处理方式

4、信号的分类

<1>可靠信号和不可靠信号 
 不可靠表现在: 
        1)当执行完信号处理函数后,恢复成缺省处理动作 
        2) 当多个信号同时抵达,可能出现信号丢失 
       1-31 :不可靠 
       34-64: 可靠

<2>实时信号和非实时信号 
实时信号都是可靠信号 
非实时信号都是不可靠信号
 

4、信号block,pending

信号的阻塞:阻止信号被处理
			在pcb中有个信号阻塞集合,这个集合的作用就是用于标记哪些信号到来的时候暂时不去处理。
		
		int sigprocmask(int how(对信号阻塞集合要进行的动作), const sigset_t *set, sigset_t *oldset);

       SIG_BLOCK       block = block | set   将set 中的信号添加到阻塞集合中

       SIG_UNBLOCK	   block = block & (-set) 对set 中的信号解除阻塞

       SIG_SETMASK     block = set 			将阻塞集合设置为set中的信号
		
		
       int sigemptyset(sigset_t *set);   清空set信号集合
	   
	   int sigfillset(sigset_t *set);	将所有信号添加到set集合中

       int sigaddset(sigset_t *set, int signum);	将signum信号添加到set集合

       int sigdelset(sigset_t *set, int signum);	将signum信号从set集合中溢出
	   
	   在所有信号中 SIGKILL -9   SIGSTOP -19  无法被阻塞/自定义/被忽略
	   
	sigpending
    读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。 

5、可重入函数与不可重入函数: 一个函数如果同时被多条线程条用,且返回的结果严格一致就是可重入函数,否则就是不可重入函数。

如果函数内部:

  1. 操纵静态变量
  2. 调用了malloc/free,因为malloc使用全局链表来管理的
  3. 使用标准IO

就是不可重入函数

可重入函数:所有标准库函数都是可重入函数,可重入函数可以被任意打断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值