软中断信号(signal,又简称为信号)是Linux下用来在进程间传递消息的方式之一,也是进程间唯一的异步通信方式。从命名中可以看出信号的实质很像中断。进程间可以通过调用kill库函数发送软中断信号,Linux内核也可能给进程发送信号,用以告知该进程发生了某个异步事件。
注意,信号只用来告知进程发生了某个异步事件,并不用来传递数据。进程收到信号后会有三种处理方式:
忽略,不做任何处理执行预先设置的处理函数(就像中断服务程序一样)采用系统的默认操作,大部分是终止进程用户
(资料图)
一般是键盘的输入会作为信号发送给进程,比如:Ctrl + C
发送SIGINT信号给进程,默认动作为终止进程;Ctrl + \
发送SIGQUIT信号给进程,默认动作为终止进程并进行内核映像转储(core dump)
内核
当进程执行出错时,内核给进程发送一个对应信号,例如:非法内存引用、浮点数溢出、执行非法指令
进程
C++的kill库函数用于进程间发送信号
信号名 | 信号值 | 默认处理动作 | 发出信号的原因 |
---|---|---|---|
SIGINT | 2 | 终止进程 | 键盘中断Ctrl+c |
SIGQUIT | 3 | 终止进程并进行内核映像转储 | 键盘的退出键被按下 |
SIGKILL | 9 | 终止进程,并且不能被捕获、忽略 | 采用kill -9 进程编号 强制杀死程序。 |
SIGSEGV | 11 | 终止进程并进行内核映像转储 | 无效的内存引用 |
SIGTERM | 15 | 终止进程 | 采用“kill 进程编号”或“killall 程序名”通知程序。 |
SIGCHLD | 20,17,18 | 忽略此信号 | 子进程结束信号 |
PS:
内核映像转储(core dump),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员 提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
#include sighandler_t signal(int signum, sighandler_t handler)//signum 表示信号的编号 //handler 表示信号的处理方式,有三种: 1. SIG_IGN:忽略改信号,不作为 2. SIG_DFL:恢复该信号的默认处理方法 3. 自定义处理函数,注意函数参数为 (int signum)
int kill(pid_t pid, int sig)//pid 目标进程号,有三种情况: 1. pid>0 将信号sig传给号为pid的进程 2. pid=0 将信号sig传给同进程组的所有进程(包括自己),常用于父进程给子进程发送信号 3. pid=-1 将信号广播到系统内所有进程,例如系统关机时向所有登录窗口广播关机信息 //sig 被发送的信号编号
通常为了程序不被干扰,程序开头通常会屏蔽所有信号,然后再用signal函数对关心的信号设置相应的处理方式。
for(int i=0; i<100; i++) signal(i, SIG_IGN);
改变信号 SIGINT
和 SIGTERM
的捕获处理,设计一个 ctrl+C
和 kill
都杀不掉的进程:
#include #include #include void func(int sig){if (sig == SIGINT) printf("\b\b杀不死,哈哈哈哈。\n"); else if (sig == SIGTERM) printf("还是杀不死,哈哈哈哈。\n");}int main(){for (int ii = 0; ii < 100; ii++) signal(ii, SIG_IGN); // 屏蔽全部的信号 signal(SIGINT, func); signal(SIGTERM, func); // 设置SIGINT和SIGTERM的处理函数 while (1);}
效果:
使用Ctrl+C
尝试关掉进程:
用 ps -ef | grep signal
找到其进程号,尝试用 kill 直接干掉:
可以看见,kill + 进程号
或 killall + 进程名
对它都无效,那改怎么杀死这个进程呢?如图,用 kill -9 进程号
:
因为kill -9 进程号
发送的信号是 SIGKILL,这个信号无法被捕获或忽略,能够快准狠杀掉进程
这个是我尝试用 kill() 函数向系统所有进程发送 SIGKILL 信号后发现的,当然是在虚拟机上,我可不敢在主机上这样搞:
#include #include int main(){kill(-1, SIGKILL);}
效果是虚拟机进入休眠,输入密码后能再进入,原以为会直接关机呢
据河南省商务厅监测,上周(11月21日至27日)河南省煤炭价格小幅下跌。上周全省煤炭均价为92429元吨,较前一周下跌06%。其中,无烟煤洗选更多
2022-12-12 10:00:3512月9日,山西省十三届人大常委会第三十八次会议表决通过了《山西省煤炭清洁高效利用促进条例》(以下简称《条例》)。这是全国第一部专门针更多
2022-12-12 09:58:18今年1至11月份,全国铁路充分发挥西煤东运、北煤南运、疆煤外运主要通道作用,大力开行万吨列车,畅通铁路与公路、港口等其他运输方式衔接更多
2022-12-12 10:17:26本周市场情况综述 产地市场本周价格小幅上涨,榆林地区涨势相对较好。近期疫情对产销运输影响消退,长途汽运基本恢复畅通,主产区供需更多
2022-12-12 10:14:042022年1-10月份,除了从俄罗斯和蒙古国进口煤炭数量同比增加外,我国从印尼、加拿大、菲律宾、美国、南非和哥伦比亚的进口煤数量同比均出更多
2022-12-12 08:55:3212月4日,山西焦煤销售公司传来消息,该公司按照国家指示和集团公司统筹部署,克服多种困难按时完成了2023年电煤中长期合同签订工作。 更多
2022-12-12 09:00:08关于鄂尔多斯市瑞德煤化有限责任公司瑞德煤矿等6处煤矿达到二级安全生产标准化等次公告〔2022〕第61号按照国家煤矿安全监察局《煤矿安全生产标更多
2022-12-12 09:05:2411月国际煤价呈现出先抑后扬的局面。 月初,全球主要进口煤终端用户进口需求持续不振,国际动力煤价格延续10月以来持续下跌的趋势。 更多
2022-12-10 22:13:1512月7日下午,山东能源集团与沙特阿拉伯国家石油公司战略合作签约仪式在济南举行。山东省政府党组成员、副省长凌文出席并致辞。山东能源集更多
2022-12-09 11:55:0412月7日下午,中国平煤神马集团总经理杜波到许继集团走访,与许继集团党委书记、董事长孙继强,总经理许涛等亲切交谈。双方在该集团会议室更多
2022-12-09 12:16:59