1.信号基本概念
信号(signal)是linux进程通讯中唯一的异步通讯方式。
信号从软件层次上看是对中断机制的一种模拟。一个进程收到信号时的处理方式与CPU收到中断请求时的处理方式一样。收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行。
信号来源:有一类信号是已经被定义好的,如数据异常、指令异常、定时器、abort等。他们都有自己特殊的用法,如:发生异常时会触发异常信号。
2.头文件
#include <signal.h>
3.函数原型
ypedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
4.代码测试
通常情况下,SIGKILL
信号不能被修改,也不能被忽略
而终止信号 SIGINT
能被修改,能被忽略
#include <signal.h>
#include<stdio.h>
//typedef void (*sighandler_t)(int);
//sighandler_t signal(int signum, sighandler_t handler);
//自处理信号函数
void handler(int signnum)
{
printf("the signnum is :%d",signnum);
switch(signnum){
case 2:
printf("SIGNINT\n");
break;
case 9:
printf("SIGKILL\n");
break;
case 10:
printf("SIGUSR1\n");
break;
}
}
int main()
{
pid_t pid;
signal(SIGINT,handler);
signal(SIGKILL,handler);
signal(SIGUSR1,handler);
printf("the pid:%d\n",getpid());
while(1);
return 0;
}
the pid:30134
Terminated
自定义kill信号
#include <signal.h>
#include<stdio.h>
#include<sys/types.h>
int main(int argc,char **argv)
{
int signnum;
int pid;
char cmd[128] = {0};
signnum = atoi(argv[1]);
pid = atoi(argv[2]);
printf("signnum:%d pid:%d\n",signnum,pid);
// kill(pid,signnum);
printf("send signal is ok!\n");
sprintf(cmd,"kill:%d %d",signnum,pid);
system(cmd);
return 0;
}
学识浅薄,希望可以帮到您