signal函数——自定义信号处理方式

1. 信号

        信号(signal)是一种通知进程已经发生某种事件的机制。例如,在终端输入Ctrl+C中断正在运行的进程,则就会触发SIGINT的信号发送给该进程。进程如何处理信号有三种选择。

1)忽略该信号。有些信号表示硬件异常,例如,除以0或访问进程地址空间以外的单元等,因为这些异常产生的后果不确定,所以不推荐使用这种处理方式。

2)按系统默认处理方式。

3)提供一个函数,信号发生时调用这个函数,成为捕捉该信号。以实现按用户自定义的方式来处理信号。

2. SIGINT信号

        SIGINT信号是针对于中断键(Ctrl + C)执行的信号,当程序正在运行,然后键入中断键,则执行此程序的进程就会终止。产生这种结果的原因是,对于此信号(SIGINT) 的系统默认动作是终止进程。该进程没有告诉系统内核对此信号作何种处理,所以系统按默认方式终止该进程。

3. signal函数

通过调用signal函数可以使得程序能够捕捉到此信号,指定发生SIGINT信号时要调用的函数名即可,函数由用户自己定义。

#include<signal.h>
void (*signal(int signo, void (*func)(int)))(int); //返回以前的信号处理配置

4. 代码示例

static int temp = 0;

void fun()
{
	if(1 == temp++)  //第二次捕捉到SIGINT信号,打印"exit succeed!"并退出
	{
		printf("exit succeed!\n");
		exit(0);
	}
	else   //第一次捕捉到SIGINT信号,打印"hello world"
	{
		printf("hello world!\n");

	}
}

int main()
{
	signal(SIGINT,fun);   //处理SIGINT信号为fun

	while(1)
	{
		sleep(2);
		printf("hello human!\n");   //循环打印
	}


	return 0;
}

猜你喜欢

转载自blog.csdn.net/judgejames/article/details/86599708