信号

一:信号:
日常生活中,我们会遇到很多信号,比如放学回家看到红灯(信号),我们的”反应”是停下来.早上当闹铃响的时候我们大多数情况是选择”关了”继续睡,或者选择”无视”.总是生活中有者各种各样的形形色色的”信号”.
简单的说所谓的信号是看到(识别),并且做出反应的行为称为信号.

当然我们也可以通过指令查看信号
kill-l可以查看所有进程

这里写图片描述
二:产生信号的条件:
1:用户在终端按下按下某些键时, 驱动程序会把信号发给前台进程如:Ctrl-C产生SIGINL信号
Ctrl-\产生SIGOUIT信号,我们看到结果有core dumped后面再分析.
这里写图片描述
Ctrl-Z产生SIGTSTP信号
这里写图片描述
2:硬件异常产生的信号,由硬件检测然后通知内核,然后内核向当前进程发送适当的信息.常见的异常如除0,会产生SIGSEGV信号并发送给进程.

  1. ⼀一个进程调⽤用kill(2)函数可以发送信号给另⼀一个进程。 可以⽤用kill(1)命令发送信号 给某个进程,kill(1)命令也是调⽤用kill(2)函数实现的,如果不明确指定信号则发送
    SIGTERM信号,该信号的默认处理动作是终⽌该进程.

三:信号处理:
1:忽略:如闹钟信号产生,大多数情况是忽略的.
2:执行给信号的默认处理动作
3:提供一个函数要求内核在处理这个信号时,切换到用户态执行这个处理函数,这正方式成为(Catch)一个信号
signal函数
这里写图片描述
signal函数的作用给某一进程某一特定信号注册相应的处理函数,对默认处理动作进程修改,修改为handler所指向的方式.
如:

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void handler(int sig)
{
    printf("get a signal %d\n",sig);
}
int main()
{
  signal(2,handler);//产生信号
  while(1)
    {
        sleep(1);
        printf("hello i am a signal\n");
    }
    return 0;
}

这里写图片描述
修改了2号信号(Ctrl-C)的默认处理方式,按Ctrl-C不会终止前台进程.
四:产生信号
1:终端产生:
前面我们知道,SIGINT默认的处理动作是终止进程,SIGOUIT的默认处理动作是终止今后才能并且Core Dump.
首先解释什么是Core Dump.当一个进程要异常终止时,可以选择把今后才能的用户空间数内存数据全部保存到磁盘上,文件名通常是core,这个叫Core Dump.进程异常终止时因为有Bug.比如非法内存的访问导致段错误,事后可以用调试器检查core文件以查清错误原因叫做事后调试,一个进程允许产生多大的core 文件取决于进程的Resourse Limit(信息保存在PCB中),在开发调试阶段可以用ulimit命令改变这个限制允许产生core 文件.

首先ulimit命令改变shll进程的Resourse Limit,允许core 为512k
$ulimit _c 512

这里写图片描述
验证:

#include<stdio.h>
#include<unistd.h>
int main()
{
printf("pid is %d\n",getpid());
    while(1);
    return 0;
}

按下Ctrl-Z就可以产生core dumped.
这里写图片描述
ulimit命令改变了shll进程的Resouse Limit,mysig进程的PCB由shell进程复制而来,所以也具有和shell进程相同的Resouse Limit值没这样就可以Core Dump.
2:调用系统函数向进程发信号:
首先在后台执行死循环程序,然后用kill命令给它发SIGSEGV信号

这里写图片描述
4255 是mysig进程的id,之所以回车才显示Segmentation fault,是因为在4255进程终止之前已经回到shell提示符等待用户输入下一条命令,shell不希望segmentation fault信息和用户的输入交错在一起,所以等用户输入命令之后才显示.kill -11 4255,11是SIGSEGV的编号.

kill命令是调用kill函数可以给一个指定的进程发送指定的信号
raise函数可以给当前进程发送指定#include

#include<stdio.h>

int main()
{
  int count =0;
    alarm(1);
   while(1)
    {
      count++;
        printf("count is %d\n",count);
    }
    return 0;
}

这里写图片描述
这个程序的作用就是1秒之内不停的数数,1秒钟到了就会被SIGALRM信号终止.

总结:
信号产生的条件:
1:在终端按下某些键产生
2:硬件异常中断产生
3:调用kill函数或者kill指令
4:alarm函数 和SIGALRM信号
处理信号的三种方式:
1:忽略此信号
2:执行默认处理动作
3:自定义(信号处理函数,信号捕捉catch)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值