Linux 程序信号处理

Linux下的信号名以SIG开头,如:SIGSEGV 段错误、SIGTERM 退出 等等,它们都在头文件<signal.h>中定义信号名和对应的值,并且信号的值都大于0。

产生信号的原因:

1.硬件异常:除零出错、无效内存的引用,如SIGSEGV表示进程访问了无效的内存地址

2.软件发送的信号:如SIGPIPE表示进程尝试写入到没有阅读的管道(或socket)时,SIGALRM进程计时器到期

3.用户按下某些终端按键:如按下Ctrl+C,产生SIGINT信号,停止进程,按下Ctrl+Z产生SIGTSTR信号,挂起前台进程组

4.通过Kill命令向特定进程发送信号

5.通过raise函数,向自身发送信号

对于信号的处理也有几种常见的方式:

1.可以忽略信号,除了SIGKILL和SIGSTOP外,其它的信号都可以由程序忽略

2.可以应用信号的默认操作,大多数信号的默认操作是结束进程,比如SIGTERM、SIGPIPE;SIGSEGV的默认操作是触发core dump,产生核心转储文件,便于进行debug

3.可以捕获信号, 比如当接收到SIGTERM时,对程序进行结束前的收尾工作,关闭文件描述符、socket,释放资源,删除临时文件;当接收到SIGCHLD时,调用waitpid获得子进程的PID,并获取它的退出码

常见的信号、说明和默认操作:

SIGABRT                   异常终止                                  coredump

SIGALRM                   报警计时器超时                         终止

SIGBUS                     总线错误                                  coredump

SIGCANCEL               取消信号                                  忽略

SIGCHLD                   子进程状态改变                         忽略

SIGCLD                     SIGCHLD的别名                       忽略

SIGCONT                   继续已停止的进程                      忽略

SIGEMT                     仿真进程陷阱                            忽略

SIGFPE                      算术异常                                  coredump

SIGFREEZE               检查点冻结                                忽略

SIGHUP                    挂断                                         终止

SIGILL                      非法指令                                   coredump

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxfzw.html