Linux—信号如何携带消息之入门版
对于Linux来说,实际信号是软中断,许多重要的程序都要处理信号,信号为Linux提供一种处理异步事件的方法,比如终端客户输入Ctl+c来中断程序,会通过信号机制停止程序。
1、信号概述
每个信号都有名字和编号,这些名字都以“SIG”开头。
信号定义在“signal.h”头文件中,信号名字都定义为整数。
具体的信号名称可以使用kill -l 来查看信号名字以序号,信号是从1开始编号的,不存在0信号,kill对于信号0又是特速应用
2、信号处理(三种):忽略、捕捉、默认动作。
a、忽略:大多数信号可以使用这个方式来处理,但是两种信号不能被忽略(SIGKILL、SIGSTOP)。因为为内核和超级用户提供了管理进程终止和停止的可靠方法。
b、捕捉: 需要告诉内核,用户希望如何处理某一种信号,说白就是写一个信号处理函数,然后告诉内核当信号产生时,由内核来调用用户自定义的函数,以此来实现信号处理
c、系统默认动作: 对于每个信号来说,系统都有对应的默认处理动作,当发生该信号,系统自动执行,不过对于系统来说,大部分都是直接杀死进程。Man 7 kill 可以查看信号手册。
初级版使用signal函数捕捉信号:
1、使用signal函数来绑定某个信号
2、使用Kill() 来发信号
signal()函数原型:
#include <signal.h>
typedef void (*sighandler_t)(int);
//是指针函数结构体
sighandler_t signal(int signum, sighandler_t handler);
signum:绑定的信号
handler:处理捕捉的信号
1、使用signal函数来绑定SIGINT;实行捕捉键盘输入Ctr +c 信号杀不死进程
demo:
#include <stdio.h>
#include <signal.h>
void handler(int signum)
{
printf("%d\n",signum);
printf("never quit\n");
}
int main()
{
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);
signal(SIGINT,handler);
signal(SIGUSR1,handler);
while(1);
system("pause");
return 0;
运行结果
LC@Embed_Learn:~$ ./signal
^C2
never quit
^C2
never quit
^C2
never quit
^C2
never quit
^C2
never quit
2、使用Kill() 来发信号杀死进程
demo:
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
char *p =(char *)malloc(sizeof(char)*128);
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);
// int kill(pid_t pid, int sig);
int signum;
int pid;
//字符转换成int整数
signum = atoi(argv[1]);
pid = atoi(argv[2]);
// int sprintf(char *str, const char *format);
//sprintf(p,"kill -%d %d",signum,pid);
kill(pid,signum);
//system(p);
printf("sifnum=%d\npid=%d\n",signum,pid);
system("pause");
return 0;
}
运行结果杀掉进程: