浅析Linux下常见信号(Signal)

终端输入man 7 signal查看手册
在这里插入图片描述
在这里插入图片描述

第一列(Signal)为信号名称

第二列(Value)为信号对应的值(实际上就是个宏定义),有多个值是因为该信号量在不同平台下的值不同(如ARM/x86),其中第二个值对应x86平台。

第三列(Action)为进程接收到信号后的默认行为,其中:
Term = Terminate,进程终结
Core = Core dump,进程终结并保存进程退出信息以供调试
Ign = Ignore,忽略信号
Stop,进程挂起/暂停
Cont = Continue,激活挂起的进程

SIGHUP
Signal Hung Up
当一个会话(Session)终止时(通常是关闭一个终端),该会话中所有进程将收到SIGHUP信号。
在这里插入图片描述
如果进程中对SIGHUP进行处理,即使关闭终端也不会终止进程。

SIGINT
Signal Interrupt
当我们在终端中输入Ctrl+C时,前台进程便会收到此信号

SIGQUIT
Signal Quit
比起SIGINT多了一个核心转储,在终端以Ctrl+\输入

SIGILL
Signal illegal
执行了非法指令。通常是因为可执行文件本身出现段错误,堆栈溢出。

SIGABRT
Signal Abort
执行abort()函数时发出的信号

SIGKILL
Signal Kill
立即终止指定进程,该信号无法被捕获或忽略

SIGPIPE
Signal Pipe
向无读者的管道写入数据时触发的信号,在网络编程中需注意处理

SIGTERM
Signal Terminate
程序结束信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。

SIGCHLD
Signal Child
子进程退出时父进程收到的信号,若父进程不用wait()对子进程退出信息进行处理,子进程将成为僵死进程占用进程表。

SIGSTOP
Signal Stop
停止(stopped)进程的执行。注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行。不能被阻塞或忽略。

SIGTSTP
停止进程的运行, 但该信号可以被捕获和忽略。 在终端输入Ctrl+Z时发出这个信号。

SIGCONT
Signal Continue
让一个停止(stopped)的进程继续执行。不可被捕获或忽略。

信号的捕获与处理

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int sig,void(*func)(int));

sig为想要处理的信号。
void(*func)(int)为处理该信号的函数。系统提供两个处理函数的宏:SIG_DFL(恢复信号默认处理方式)SIG_IGN(忽略该信号),当然用户也可以自定义处理函数。
返回值sighandler_t将返回该信号的上一个处理函数,如出错则返回SIG_ERR,错误信息保存在errno

实例

#include <iostream>
#include <unistd.h>
#include <signal.h>

void sighandle(int sig)
{
    std::cout << std::endl 
    		  << "signal received :" 
              << sig
              << std::endl;
}
int main(int argc,char **argv)
{
       signal(SIGHUP, SIG_IGN);//忽略SIGHUP
       signal(SIGINT, sighandle);//收到SIGINT时跳转到处理函数sighandle
       pause();
       return 0;
}

运行程序后输入Ctrl+C,成功捕获SIGINT信号
在这里插入图片描述
将终端关闭后开启新的终端,查询发现程序依然在后台运行,忽略了终端关闭时发送的SIGHUP信号
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值