-
signal
函数的使用
signal
系统函数调用提供了一种最简单的范例。
然而,
由于
C
原形声明的缘故使它看起来比
实际复杂。<
/p>
signal
函数将一个给定的函数和一个特定的信号联系。
p>
这里是
FreeBSD
中的定义
(
和一个
typedef
一起
):
引用:
typedef void (*sig_t) (int);
sig_t
signal(int sig,
sig_t func);
<
/p>
第一个参数是目标信号。
func
参数是
一个指针,
指向某个处理该信号的函数。
这个处理信号
函数带有一个
int
型参数,并应返回
void
。
signal
函数中的
func
参数也可以设定为下面的一
些值:
引用:
SIG_IGN:
如果
func
p>
参数被设置为
SIG_IGN
,该信号将被
忽略。
SIG_DFL:
如果
func
p>
参数被设置为
SIG_DFL
,该信号会按
照确定行为处理。
PS
:
sig
信号的可能类型:
#define SIGHUP
1
/* hangup */
SIGHUP
是
Unix
系统管理员很常用的一个信号。许多后台服务进
程在接受到该信号后将会
重新读取它们的配置文件。
然而,
p>
该信号的实际功能是通知进程它的控制终端被断开。
缺省
行为是终止进程。
#define SIGINT
2
/*
interrupt */
对于
Unix
使用者来说,
SIGINT
是另外一个常用的信号。许多<
/p>
shell
的
CTRL-C
组合使得这
个信号被大家所熟知。该信号的正式名字是中断信号。缺省行为是
终止进程。
#define SIGQUIT
3
/* quit */
SIGQUIT
信号被用于接收
shell
p>
的
CTRL-/
组合。另外,它还用于告知
进程退出。这是一个
常用信号,用来通知应用程序从容的(译注
:
即在结束前执行一些退出动作)关闭。缺省行
为是终止进程,
并且创建一个核心转储。
#define SIGILL
4
/*
illegal instr. (not reset when caught) */
< br>如果正在执行的进程中包含非法指令,操作系统将向该进程发送
SIGILL
p>
信号。如果你的程
序使用了线程,或者
po
inter
functions
,那么可能的话可以尝试捕获
该信号来协助调试。
(
[color=Red]
注意:原文这句为:
“If
your
progr
am
makes
use
of
use
of
threads,
or
pointer
functions, try to
catch this signal if possible for aid in debugging
.”
。
中间的两个
use of
use of
,
不
知是原书排版的瑕疵
还是我确实没有明白其意义;另外,偶经常听说
functions
< br>pointer
,对
于
poin
ter
functions
,
goo
gle
了一下,应该是
fortran
里面的东西,不管怎样,还真不知道,
确切含义还请知道的兄弟斧正。
< br>[/color]
)缺省行为是终止进程,并且创建一个核心转储。
#define SIGTRAP
5
/* trace trap (not reset
when caught) */
SIGTRAP
这个信号是
由
POSIX
标准定义的,
用于调试目
的。
当被调试进程接收到该信号时,
就意味着它到达了某一个调
试断点。
一旦这个信号被交付,
被调试的进程就会停止,
并且它
的父进程将接到通知。缺省行为是终止进程,并且创建一个核心
转储。
#define SIGABRT
6
/* abort() */
SI
GABRT
提供了一种在异常终止
(abort)
一个进程的同时创建一个核心转储的方法。然而如
果该信号被捕获,并且信号
处理句柄没有返回,那么进程不会终止。缺省行为是终止进程,
并且创建一个核心转储。
#define SIGFPE
8
/* floating
point exception */
当进程发生一个浮点错误时,
SIGFPE
信号被发送给该进程。对于那些处理复杂数学运算的
程序,一般会建议你捕获该信号。缺省行为是终止进程,并且创建一个核心转储。
#define SIGKILL
9
/* kill (cannot be caught
or ignored) */
SIGKILL
是这些信号中
最难对付的一个。正如你在它旁边的注释中看到的那样,这个信号
不能被捕获或忽略。<
/p>
一旦该信号被交付给一个进程,那么这个进程就会终止。然而,会有一
些极少数情况
SIGKILL
不会终止进程。这些罕见的情
形在处理一个
“
非中断操作
”
(比如磁
盘
I/O
)的
时候发生。虽然这样的情形极少发生,然而一旦发生的话,会造成进程死锁。唯
一结束进
程的办法就只有重新启动了。缺省行为是终止进程。
#define SIGBUS
10
/*
bus error */
如同它的名字暗示的那样,
CPU
检测到数据总线上的错误时将产生
SIGBUS
信号。当程序
尝试去访问一个没有正确对齐的内存地址时就会产生该信号。
p>
缺省行为是终止进程,
并且创
建一个核心转
储。
#define SIGSEGV
11
/* segmentation violation */
SIGSEGV
是另一个
C/C++
程序员很熟悉的信号。当程序没有权利访问一个受保护的内存地
址时,或者访问无效的虚
拟内存地址(脏指针,
dirty
pointers
,译注:由于没有和后备存储
器中内容进行同步而造成。
关于野指针,
可以参见
/wiki/Wild_poi
nter
的
解释。
)时,会产生这个
信号。缺省行为是终止进程,并且创建一个核心转储。