供参考:Linux 信号(signal)
查看系统名称以及序号:kill -l
信号处理的三种方式:忽略、捕捉和默认动作
忽略动作:对 SIGKILL 和 SIGSTOP 无效
捕捉动作:用户将信号告诉内核
默认动作:由默认的处理动作,自动执行
./a.out程序是个死循环,通过终端 kill 命令发送信号,将进程终止
代码演示:signal配合 终端killl 指令
#include <signal.h>
#include <stdio.h>
void handler(int signum)
{
switch(signum){
case 2:
printf("SIGINT\n");
break;
case 3:
printf("SIGQUIT\n");
break;
case 9:
printf("SIGKILL\n");
}
}
int main()
{
signal(SIGINT,handler);
signal(SIGQUIT,handler);
signal(SIGKILL,handler);
while(1);
return 0;
}
通过终端指令向进程发送信号,进程会打印相应的信号 但是发送 “SIGKILL” 信号,不会打印相应的信号,会被直接终止进程(SIGKILL 和 SIGSTOP 信号无法被忽略)
代码演示:signal配合 自制指令
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int pid;
int signum;
char cmd[128]={0};
pid = atoi(argv[2]);
signum = atoi(argv[1]);
sprintf(cmd,"kill -%d %d",signum,pid);
system(cmd);
return 0;
}
SIG_IGN(忽略信号)
#include <stdio.h>
#include <signal.h>
void handler(int signum)
{
printf("SIGINT\n");
}
int main()
{
signal(SIGINT,SIG_IGN);
while(1);
return 0;
}
当该程序运行时,按 “ctrl+c” 程序不会退出(不执行该行代码,直接忽略);终止程序,要用终端 kill 命令终止 若signal(SIGKILL,SIG_IGN),当该程序运行时,按 “ctrl+c” 程序直接退出(无法忽略)
|