信号是由用户、系统或者进程发送给目标进程的信息,比如终端用户输入了ctrl+c来中断程序,会通过信号机制停止一个程序
信号概述 信号4要素:信号编号、名称、对应事件、默认处理动作每个信号都有一个名称和编号,名字是以"SIG"开头,例如“SIGIO”等
信号定义在signal.h头文件中,信号名称都定义为正整数
具体信号名称可以使用kill -l 来查看信号名字以及序号 信号的处理:信号处理有三种方式:分别是忽略,捕捉,以及默认系统动作
忽略:假设一个场景,当年在看电视的时候,有人敲门这时候你可以忽略他人
大多数信号可以用这个方式来处理,除了两种信号不能被忽略(SIGKILL和SIGSTOP),因为他们向内核和超级用户提供了进程终止和停止的可靠方法,如果忽略了,那么这个进程变成了没人能管理的进程
捕捉:像极了单片机里的中断,中断处理函数
需要告诉内核,用户希望如何处理某一种信号,就是写一个信号处理函数,然后将这个函数告诉内核,当该信号产生时,内核来调用用户自定义的函数,从而实现某种信号的处理
默认系统动作:对于每个信号来说,系统对应由默认的处理动作,当发生了该信号,系统就会自动执行
信号是如何来使用的?常用kill命令是一个发送信号的工具
//while1.c #includeint main() { while(1); return 0; }
对于信号来说,最大意义不是用了杀死信号,而是实现一些异步通讯(捕捉信号)的手段,那么如何来自定义信号的处理函数呢?
信号编程入门级函数;signal
函数原型
#includetypedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
高级函数:sigaction
#include信号处理发送函数int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
入门版:kill
#include#include int kill(pid_t pid, int sig); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): kill(): _POSIX_C_SOURCE
高级版:sigqueue
#includeint sigqueue(pid_t pid, int sig, const union sigval value); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): sigqueue(): _POSIX_C_SOURCE >= 199309L
捕捉信号:键盘按下ctrl+c(SIGINT)无法退出,系统的默认动作ctrl+c是进程终止,通过捕捉信号,修改默认系统动作,执行用户自定义的函数
#include#include //typedef void (*sighandler_t)(int); //sighandler_t signal(int signum, sighandler_t handler); void handler(int signum) { printf("get signum = %dn ",signum); printf("no quitn"); } int main() { signal(SIGINT,handler); //信号注册 while(1); return 0; }
代码实现
可以收到各种信号
#include#include //typedef void (*sighandler_t)(int); //sighandler_t signal(int signum, sighandler_t handler); void handler(int signum) { printf("get signum = %dn ",signum); switch(signum){ case 2: printf("SIGINT"); break; case 9: printf("SIGKILL"); break; case 10: printf("SIGUSR1"); break; } } int main() { signal(SIGINT,handler); //信号注册 signal(SIGKILL,handler); //信号注册 signal(SIGUSR1,handler); //信号注册 while(1); return 0; }
代码实现
// signa2.c #include#include #include #include #include int main(int argc,char **argv) { int signum; int pid; signum = atoi(argv[1]); pid = atoi(argv[2]); printf("signum =%d,pid=%d",signum,pid); kill(pid,signum); return 0; }
代码实现



