信号机制讲解

一、信号简介

信号是Linux系统为了相应某些状况而产生的事件。

进程收到信号后采取相应的动作。

kill -l可以查看所有信号
在这里插入图片描述

二、信号的产生

  • 按键触发:比如ctrl + C 产生了SIGINT(2);ctrl + \ 产生SIGQUIT (3) ; ctrl +z 产生了SIGSTOP(19)

  • 非法内存操作:如果内存管理出错,系统就会发送信号进行处理,SIGSEGV(11)

  • 硬件故障:硬件出现故障或者接触不良等,系统也会发送一个信号;

  • 由软件条件产生信号,系统调用或者其他条件。

三、信号处理

1、signal函数

#include <signal.h>
typedef void (*sighandler_t)(int);		//函数指针,对应下面的handle函数
sighandler_t signal(int signum, sighandler_t handler);

函数原型:
    sighandler_t signal(int signum, sighandler_t handler);
参数:
    @ signum : 信号号
    @ handler:处理方式
        信号的处理方式有三种:默认、捕捉、忽略
        
        1)捕捉:
		       使用处理函数:
		       void signal_handle(int signum){
		           //对信号进行处理的执行代码                    
		       }

        2)默认:signal函数的第二个参数handler直接填为SIG_DFL;
        
        3)忽略:signal函数的第二个参数handler直接填为SIG_IGN;
        
返回值:成功返回函数的第二个参数,失败返回SIG_ERR,并置位错误码。

2、示例

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void signal_handle(int signum){
    if(signum == 2){		
        printf("catch %d signal\n", signum);
        system("ls");
    }    
}

int main(){
    while(1){
        //忽略
        //signal(SIGINT, SIG_IGN);			//传入的参数可以是数字,也可以是信号的名字
        
        //默认
        //signal(19, SIG_DFL);
        
        //捕捉                            
        signal(2, signal_handle);

    }
    return 0;
}

3、特殊信号

SIGKILL(9) SIGSTOP(19)
信号9和信号19,不能被忽略和捕捉

4、kill命令

格式:
    kill [options] <pid> [...]
参数:    
    		options : 要发送的信号
    		pid :     进程号,
    		每一个程序运行的时候都会产生一个进程号,查看进程号的命令:ps -ef
比如要对某个进程发送2号信号,可以写为kill -2 进程号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好睡觉好好吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值