简历制作网站免费,wordpress fly主题,公司网站模板最新,免费制作一个自己的网站吗对于 linux来说#xff0c;信号是软中断。许多重要的程序都需要处理信号。信号#xff0c;为linux提供了一种处理异步事件的方法。比如#xff0c;终端用户输入了ctrlc来中断程序#xff0c;会通过信号机制停止一个程序。
一、信号概述#xff1a; 1、信号的名字和编号信号是软中断。许多重要的程序都需要处理信号。信号为linux提供了一种处理异步事件的方法。比如终端用户输入了ctrlc来中断程序会通过信号机制停止一个程序。
一、信号概述 1、信号的名字和编号 每个信号都有一个名字和编号名字都以SIG开头。 信号定义在 signal.h头文件中信号名都定义为正整数。 信号是从1开始编号的不存在0号信号。 使用kill -l来查看信号的名字以及序号。kill对0信号有特殊应用。 编号1-64 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN1 36) SIGRTMIN2 37) SIGRTMIN3
38) SIGRTMIN4 39) SIGRTMIN5 40) SIGRTMIN6 41) SIGRTMIN7 42) SIGRTMIN8
43) SIGRTMIN9 44) SIGRTMIN10 45) SIGRTMIN11 46) SIGRTMIN12 47) SIGRTMIN13
48) SIGRTMIN14 49) SIGRTMIN15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX 2、信号处理的方式 忽略捕捉默认动作 忽略信号 大多数信号可以使用这个方式来处理。但是 SIGKILL和SIGSTOP信号无法忽略。 捕捉信号 需要高速内核用户希望如何处理某一种信号说白了就是写一个信号处理函数然后将这个函数高速内核。当该信号产生时由内核来调用用户自定义的函数以此来实现某种信号的处理。 系统默认动作 对于每个信号来说系统对应默认的处理动作当发生了该信号系统会自动执行。 具体的信号默认动作可以使用man 7 signal 来查看系统的具体定义。 kill命令就是一个发送信号的工具 kill 9 PID杀死进程 kill -SIGKILL PID杀死进程 使用ps指令来查看pid号ps -aux|grep 运行的程序
二、信号处理函数的注册 信号处理函数的注册不只是一种方法分为入门版和高级版 1、入门版函数signal 2、高级版函数sigaction
#include signal.htypedef void (*sighandler_t)(int);//指针返回void类型参数为整型数sighandler_t函数名
sighandler_t signal(int signum, sighandler_t handler);
//信号指针三、信号处理函数的发送 信号处理函数的发送也不止一个也分为入门版和高级版 1、入门版kill 2、高级版sigqueue
#include sys/types.h
#include signal.hint kill(pid_t pid, int sig);例 实现信号ctrlc关闭不了进程
#include signal.h
#include stdio.hvoid handler(int signum)
{printf(get signal%d\n,signum);switch(signum){case 2:printf(SIGINT\n);break;case 9:printf(SIGKILL);break;case 10:printf(SIGUSR1);break;}printf(never quit !\n);
}int main()
{signal(SIGINT,handler);signal(SIGKILL,handler);signal(SIGUSR1,handler);while(1);return 0;
}结果
^Cget signal2 //按CTRLC得到
SIGINT
never quit !
^Cget signal2
SIGINT
never quit !
get signum10 //发送信号 kill -10 PID得到
SIGUSR1
never quit !
Killed //发送信号 kill -9 PID得到信号的发送程序
//信号发送#include signal.h
#include sys/types.h
#include stdio.hint main(int argc,char **argv)
{int signum;int pid;/*方法二*//*char cmd[128] {0};*/signum atoi(argv[1]);pid atoi(argv[2]);printf(num %d,pid %d\n,signum,pid);//int kill(pid_t pid, int sig);kill(pid,signum);/*sprintf(cmd,kill -%d %d,signum,pid);作出一个指令 kill -9 xxxxsystem(cmd);*/printf(send signal ok !\n);return 0;
}如何忽略信号 SIG_IGN 修改代码 signal(SIGINT,handler);为signal(SIGINT,SIG_IGN);