linux学习笔记9-信号
信号
- 信号通常用来向一个进程通知事件.
- 信号是不可提前预知的.
进程接收信号处理(3种方式选其一)
- 忽略这个信号.
- 捕获这个信号(需要特殊的代码去处理).
- 允许执行信号的默认操作.
信号未决
产生信号和传递信号之间的时间间隔,叫信号未决.捕获信号
1.发送信号和捕获信号是相辅相成的. 2.SIGSTOP和SIGKILL这两个信号进程不能捕获,进程收到这两个信号会直接默认处理的.
3.进程捕获到信号,对该信号进行处理时,进程正在执行的指令临时中断,开始执行该信号的指令.信号处理结束,开始捕获信号前的指令
4.在信号处理时,不能判断进程中的指令在何处执行.
函数指针(临时插播,捕获信号需要使用)
#include <stdio.h>
#include <stdlib.h>
int func(int a,int b)
{
return a+b;
}
int main(int argc,char *argv[])
{
int (*p)(int,int); //声明一个函数指针
p = func; //将函数指针func函数
printf("sum=%d\n",p(10,20));//通过函数指针调用函数
return 0;
}
man signal帮助
//信号所需的头文件
#include <signal.h>
//要声明一个void返回类型并有一个int参数的函数 回调函数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal使用
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
//捕获信号并处理(回调函数)
void signal_handler(int sign)
{
switch(sign)
{
case SIGINT:
printf("signal SIGINT!\n");
sleep(5); //休眠5秒钟,sleep也可以被信号唤醒的
break;
}
}
int main(int argc,char *argv[])
{
signal(SIGINT,signal_handler); //设置要捕获SIGINT信号,由Ctrl+C触发,具体什么时候触发不清楚
int count = 0;
while(count < 50)
{
printf("print %d\n",++count);
sleep(1);
}
return 0;
}
kill不单单是结束进程,还可以发送信号
kill -s 2 24863 //-s代表 2代表SIGINT 24863代表进程id
秋风
2016-11-25