Linux中的信号

1、信号是UNIX系统响应某些状况而产生的事件,进程在接收到信息时会采取响应的行动.

2、信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等

3、信号是在软件层次上对中断的一种模拟,所以通常把它称为软中断





注意:SIGINT (ctrl+c)

           SIGQUIT(ctrl+\)

进程对信号的三种响应既处理方式:

1、忽略信号
不采取任何操作、有两个信号不能被忽略:SIGKILL和SIGSTOP

2、捕获并处理信号

内核中断正在执行的代码,转去执行先前注册过的处理程序

3、执行默认操作

默认操作通常是终止进程,这取决于被发送的信号。



signal函数的使用:

typedef void (*__sighandler_t) (int);
#define SIG_ERR ((__sighandler_t) -1)
#define SIG_DFL ((__sighandler_t) 0)
#define SIG_IGN ((__sighandler_t) 1)
函数原型:
__sighandler_t signal(int signum, __sighandler_t handler);
参数:
signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出
handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void
handler也可以是下面两个特殊值:
SIG_IGN 屏蔽该信号
SIG_DFL 恢复默认行为

代码:

/*
 * signalDemo.cpp
 *
 *  Created on: Jul 31, 2014
 *      Author: zfs
 */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <signal.h>
/*
 #define ERROR_EXIT(m)(perror(m),exit(EXIT_FAILURE))
 */
#define ERROR_EXIT(m) \
	   do\
	   {      \
		   perror(m);\
           exit(EXIT_FAILURE);\
        }\
	   while(0)

void handler(int sig);

int main(int argc, char* argv[]) {
	__sighandler_t oldhandler;
	oldhandler = signal(SIGINT, handler);
	if (oldhandler == SIG_ERR )
		ERROR_EXIT("signal error");
	while (getchar() != '\n')
		;
	/* if(signal(SIGINT,oldhandler)==SIG_ERR)*/
	if (signal(SIGINT, SIG_DFL ) == SIG_ERR )
		ERROR_EXIT("signal error");

	for (;;)
		;
	return 0;
}
void handler(int sig) {
	printf("receive signal sig=%d\n", sig);
}
</span>
输出:

^Creceive signal sig=2
^Creceive signal sig=2
^Creceive signal sig=2
^Creceive signal sig=2
\


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值