一、信号的基本概念
进程之间常用的通信手段
信号,通知某个进程发生某一件事情
都是突发事件,是异步发生的,所以也被称为“软件中断“
二、信号如何产生?
- 1、某个进程发送给自己或者另一个进程
- 2、由内核发送给某个进程
- 2.1、键盘上发送,如ctrl+c,或者kill processid
- 2.2、内存访问有问题,除数为0,硬件检测到,并通知内核
三、信号的名字,一般都是SIG开头
unix以及类unix系统(linux),支持的信号的数量各不相同
信号有名字,其实也是代表一些数字,正整数常量
#include<signal.h> (/usr/include)
使用如下命令即可寻找
find / -name "signal.h" | xargs grep -in "SIGHUP"
从根目录,找名字为 signal.h的文件,xargs:在内容中寻找SIGHUP字符串
find / -name "signal.h" | xargs grep -in "SIGHUP"
直接找到定义的文件,看到
#define SIGHUP 1
这就是一些宏定义
四、 通过kill来理解信号
可以查看kill的参数表,自行百度
kill -param processid
,就是发了一个信号
1~32之间
kill -正数参数 pid
正数
就是signal.h
中宏定义
的信号
很多信号的缺省动作都是杀死进程
kill -1 pid :发送SIGHUP
kill -2 pid :发送SIGINT
五、附着进程
strace -e trace=signal -p pid
附着进程
可以查看该进程接收到了什么信号
如下面的一段代码:
int main()
{
printf("hello world");
for (; ; )
{
sleep(1);
printf("进程正在运行\n");
}
}
在bash1中执行该程序
在bash2中查看,并使用strace附着该进程,查看该进程收到的信号
在bash3中使用1->SIGHUP信号杀死该进程
在bash2中可以看到,收到了SIGHUP信号,被pid为7969杀死
六
-
进程状态查看
ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 'PID|LinuxTestC|bash'
ps aux | grep -E 'PID|LinuxTestC|bash'
所谓BSD风格显示格式
可以查询linux进程状态表可以查看
-
常用信号列举
- 1、默认动作,一般是杀死进程
- 2、忽略此信号,但是不包括SIGKILL和SIGSTOP
比如kill -9/SIGKILL pid,是一定能把进程杀死的 - 3、捕捉该信号,写一个函数,进程该信号的特殊处理,但是yeshibubaokuoSIGKILL和SIGSTOP