Linux—信号如何携带消息之入门版

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;
}
                

运行结果杀掉进程:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值