一:信号:
日常生活中,我们会遇到很多信号,比如放学回家看到红灯(信号),我们的”反应”是停下来.早上当闹铃响的时候我们大多数情况是选择”关了”继续睡,或者选择”无视”.总是生活中有者各种各样的形形色色的”信号”.
简单的说所谓的信号是看到(识别),并且做出反应的行为称为信号.
当然我们也可以通过指令查看信号
kill-l可以查看所有进程
二:产生信号的条件:
1:用户在终端按下按下某些键时, 驱动程序会把信号发给前台进程如:Ctrl-C产生SIGINL信号
Ctrl-\产生SIGOUIT信号,我们看到结果有core dumped后面再分析.
Ctrl-Z产生SIGTSTP信号
2:硬件异常产生的信号,由硬件检测然后通知内核,然后内核向当前进程发送适当的信息.常见的异常如除0,会产生SIGSEGV信号并发送给进程.
- ⼀一个进程调⽤用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)