信号与不可重入

本文介绍了信号在软件中断中的作用,包括常见的信号类型和处理动作。当进程接收到信号时,可以选择忽略、捕捉或执行默认动作。特别强调了信号处理函数必须是可重入的,以确保线程安全。同时,讨论了不可重入函数的特点,如使用静态数据结构、调用malloc或free函数以及标准IO函数,这些在多线程环境下可能导致问题。

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

信号

信号是软件中断。提供了一种处理异步事件的方法。例如当用户在终端输入中断键(ctrl+c),会向前台进程发送一个中止信号SIGINT,以此来中止一个进程。

信号通常以SIG3个字符开头作为命名,例如SIGABRT是夭折信号;当进程调用abort函数时发出这种信号。SIGALARM是闹钟信号,由alarm函数设定的定时器超时后将产生这种信号。

几种常见的信号类型:

①当用户在终端输入某些键时,引起终端产生相应的信号。例如按下DELETE键或者Ctrl+C键将产生中断信号SIGINT。该信号用于停止一个失去控制的程序。

②硬件产生信号,区别于硬件中断。例如发生除0,引用无效地址。这些事件由硬件检测到,通知内核,然后内核向正在执行的进程产生相应的信号。

③进程调用kill(2)函数可以将任意信号发送给另外一个进程。但是其限制是接收信号进程和发送信号进程的所有者相同。或者发送该信号的进程为超级用户root

④当检测到某种软件条件发生,应向有关进程产生信号。例如SIGURG (网络链接上传来带外的数据)、SIGPIPE(在管道的读进程已结束,一个进程在写管道)以及SIGALRM(进程设定的定时器超时)

信号处理动作

①忽略此信号。大部分信号采取这种方式被处理,但SIGKILL和SIGSTOP这两种信号不能被忽略:因为它们是内核和超级用户使得进程终止或者停止的可靠方法。另外,如果引用错误的内存地址等异常产生的信号也不该被忽略,否则造成程序运行行为未定义。

②捕捉信号。应用程序必需提供一个函数,使得当相应的信号发生时,该事件能够按照定义被处理。例如如果捕获到SIGCHLD信号(子进程已经终止),那么此信号处理函数很可能调用waitpid获得子进程的进程ID和它的终止状态。

执行系统默认动作。值得注意的是,对于大多数信号的默认动作,是终止该进程,

函数signal

void (*signal(int signo,void
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值