void (*signal(int signo,void (*func)(int))) (int)
这个函数中,最外层的函数体
void (* XXX )(int)表明是一个指针,指向一个函数XXX的指针,XXX所代表的函数需要一个int型的参数,返回void
signal(int signo, void(*func)(int))是signal函数的主体.
需要两个参数int型的signo以及一个指向函数的函数.
void (*func)(int).
正是由于其复杂性,在[Plauger 1992]用typedef来对其进行简化
typedef void Sigfuc(int);//这里可以看成一个返回值 .
再对signal函数进行简化就是这样的了
Sigfunc *signal(int,Sigfuc *);
我们在使用时signal,第一个参数代表信号,第二个参数代表接收到这个参数时所进行的操作。
kill函数的定义和原型如下:
int kill(pid_t pid, int sig);
使用时要引入如下的两个头文件:
#include <sys/types.h>
#include <signal.h>
参数说明:
pid:可能选择有以下四种:
1. pid大于零时,pid是信号欲送往的进程的标识。
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4. pid小于-1时,信号将送往以-pid为组标识的进程。
sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EINVAL:指定的信号码无效
EPERM;没有给任何目标进程发送信号的权限
ESRCH:目标进程或进程组不存在
#define SIGHUP 1
进程由於控制终端死去或者控制终端发出起命令
#define SIGINT 2
键盘中断所产生的信号
#define SIGQUIT 3
键盘终止
#define SIGILL 4
非法的指令
#define SIGTRAP 5
进程遇到一个追踪(trace)或者是一个中断嵌套
#define SIGABRT 6
由abort系统调用所产生的中断信号
#define SIGIOT 6
类似於SIGABRT
#define SIGBUS 7
进程试图使用不合理的记忆体
#define SIGFPE 8
浮点异常
#define SIGKILL 9
KILL
#define SIGUSR1 10
用户自定义
#define SIGSEGV 11
段错误
#define SIGUSR2 12
用户自定义
#define SIGPIPE 13
管道操作时没有读只写
#define SIGALRM 14
由alarm系统调用产生的timer时钟信号
#define SIGTERM 15
收到终端信号的进程
#define SIGSTKFLT 16
堆叠错误
#define SIGCHLD 17
子进程向父进程发出的子进程已经stop或者终止的信号
#define SIGCONT 18
继续运行的信号
#define SIGSTOP 19
stop
#define SIGTSTP 20
键盘所产生的stop信号
#define SIGTTIN 21
当运行在後状态时却需要读取stdin的资料
#define SIGTTOU 22
当运行在後状态时却需要写向stdout
#define SIGURG 23
socket的紧急情况
#define SIGXCPU 24
进程超额使用CPU分配的时间
#define SIGXFSZ 25
进程使用了超出系统规定文件长度的文件
#define SIGVTALRM 26
内部的alarm时钟过期
#define SIGPROF 27
在一个程式段中描绘时钟集过期
#define SIGWINCH 28
终端视窗的改变
#define SIGIO 29
非同步IO
#define SIGPOLL SIGIO
pollable事件发生
如何去册一个信号handler?
首先,用sigprocmask设置或者更改信号mask,如果信号mask没有被设置,所有的信号采用预设的
方式处理,一旦设置了mask,就使用sigaction俘获信号
int sigprocmask(int how,const sigset_t,sigset_t *oldset);
how有以下值:
SIG_BLOCK 集合中包含额外的信号需要阻塞
SIG_UNBLOCK 集合中包含额外的信号需要不阻塞
SIG_SETMASK 集合中包含新的信号mask
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
*sa_handler指向信号处理的函数,sa_handler的参数可以是SIG_DFL,
,启动信号处理的预设值,如果是SIG_IN,将忽略信号.
信号处理的过程中,需要使用sa_mask定义一套需要遮罩的信号
sa_flags是改变sa_handler行为的mask,它可以是以下几种:
(1)SA_NOCLDSTOP
忽略子进程发出的SIGSTOP,SIGTSTP,SIGTTIN,SIGTTAU
(2)SA_ONESHOT或者SA_RESETHAND
册的定制的信号处理仅仅被执行一次,在它被执行後,信号的缺省操作将被还原
(3)SA_RESTART
使能可重起的系统调用
(4)SA_NOMASK或者SA_NODEFER
dont prevent the signal from being recieved within its own handler
忽略sa_restorer,它无需使用