信号signal编号及意义及一般处理

本文介绍了Linux系统中几种常见的信号类型及其含义,例如SIGQUIT、SIGILL等,并探讨了信号处理的重要性,包括如何通过指定信号处理函数来避免程序因异常信号而无法正常运行。

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

SIGQUIT:停止

SIGILL:illegal instruction

SIGABRT:Abort

SIGFPE:Float point exception

SIGPIPE:Broken pipe

SIGBUS:总线错误(访问mem)

SIGSEGV:段错误

一般情况下,程序应对上述信号进行处理,一方面探测程序bug,另一方面防止一些异常信号促使程序不能正常运行。

 

信号处理

  • linux对每种信号都规定了默认动作,具体可参考man 7 signal
  • SIGCHLD 忽略
  • 实时信号结束进程。
  • 如果不想程序采用默认动作处理进程,需要捕捉函数(为想要特殊处理的函数指定信号处理函数)。
  • 如发生SIGALARM或SIGPIPE,进行超时处理即可,不必终止进程。此外若想发生信号时做特殊处理也应指定信号处理函数,如发生段错误时,提示用户等。
### Linux 信号处理实现方法 #### 一、信号的概念与作用 在 Unix 和类 Unix 系统(如 Linux)中,信号是一种通知机制,用于进程间通信。当某个特定事件发生时,内核会向目标进程发送一个信号来告知其发生了什么情况[^4]。 #### 二、常见的信号及其含义 一些常用的信号包括但不限于 SIGINT (中断),SIGKILL (强制终止), SIGHUP (挂起)等。每种信号都有各自的意义并触发相应的默认行为或自定义动作[^3]。 #### 三、捕获和处理信号的方式 为了能够响应各种类型的信号,应用程序可以通过调用 `signal()` 函数设置对应的处理器函数;对于更复杂的场景,则推荐使用 POSIX 提供的标准接口 sigaction() 来替代旧版 API 。下面给出一段简单的 C 语言代码示例展示如何捕捉 Ctrl+C 所产生的 SIGINT 信号: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void handle_sigint(int signum){ printf("Caught signal %d\n",signum); } int main(){ struct sigaction sa; sa.sa_handler = &handle_sigint; // 设置信号处理器 sigemptyset(&sa.sa_mask); // 清除掩码集合 sa.sa_flags = SA_RESTART; // 处理后自动重启被中断的系统调用 if(sigaction(SIGINT,&sa,NULL)==-1){ perror("sigaction"); exit(1); } while(1){sleep(1);} // 进入无限循环等待接收信号 } ``` 这段程序创建了一个名为`handle_sigint` 的回调函数用来打印接收到的信号编号,并将其绑定到 SIGINT 上。一旦用户按下组合键Ctrl+C就会执行此函数而不是立即退出应用[^2]。 #### 四、深入理解信号的工作流程 从底层角度来看,在 Linux 中每当有新的信号到达时,它会被加入到当前进程中维护的一个队列里直到该进程进入可运行状态为止。此时如果发现有待处理的新消息则会暂停正常指令流转而跳转至预先设定好的异常入口地址处继续执行直至完成整个过程后再返回原来的地方恢复工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值