linux学习笔记9-信号

信号

  1. 信号通常用来向一个进程通知事件.
  2. 信号是不可提前预知的.

进程接收信号处理(3种方式选其一)

  1. 忽略这个信号.
  2. 捕获这个信号(需要特殊的代码去处理).
  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