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
\