- 信号:操作系统预先定义好的某些特定事件的集合,信号可以被产生,也可以被接收
- 信号响应方式:默认 SIG_DFL 忽略 SIG_IGN 自定义
自定义修改信号的相应方式:
typedef void (*Fun)(int);
Fun signal(int signum,Fun fun);//signum:信号类型,信号值
用kill -l查看系统定义的信号列表
我们可以观察到:每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定义#define SIGINT 2,Ctrl-C产生的信号只能发给前台进程 。
注:1至31号信号,是非实时信号,发送的信号可能会丢失,不支持信号排队。如果连续收n个相同的信号,接收信号的进程会将所有的信号合并成一个信号!
编号34以上的是实时信号,支持信号排队,发送的多个实时信号都会被接收.
在Linux中键入 vim /usr/include/bits/signum.h,我们可以看到系统定义的一些信号:
- 信号的发送
int kill(pid_t pid,int signum);
//pid_t pid 将信号发送给哪个进程
//发送的信号类型
pid > 0 :指定接收进程的PID
pid = = 0 :将信号发送给当前进程组中所有的进程
pid == -1 :将信号发送给系统上所有的进程(有权限发送)
pid < -1 :将信号发送给进程组ID为-pid组内所有的进程。
- 两个进程同时给一个进程发送相同的信号、连续两次发送同一个信号给同一个进程时:如果第一个信号正在处理,则第二个信号会等待第一个信号处理完成。
代码实例:进程第一次接收信号打印helloworld,第二次接收结束进程。
#include <stdio.h>
#include <signal.h>
void fun(int sign)
{
printf("hello world\n");
signal(SIGINT,SIG_DFL);
}
int main()
{
signal(SIGINT,fun);
while(1)
{
sleep(1);
printf("main running\n");
}
}