信号是unix和linux系统响应某些条件而产生的一个事件。如果进程接收到信号,但事先没有安排捕获它,进程将会立刻终止。按照通常情况配置,在键盘上敲入中断字符就会向前台进程(即当前运行的进程)发送SIGINT信号,这将引起该进程的终止,除非它事先安排了捕获这个信号。如果想发送一个信号给一个进程,且这个进程不是当前的前台程序,就需要kill命令
int kill(pid_t pid, int sig)
闹钟函数
unsigned int alarm (unsigned int seconds)
该函数在seconds秒之后安排发送一个SIGALRM信号。
常用的信号接口为signal和sigaction,sigaction相对比较健壮,推荐使用。以下是sigaction的一些信息。
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
|
int sigaction(int signo,const struct sigaction *restrict
act,
struct sigaction *restrict
oact);
结构sigaction定义如下:
|
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int,siginfo_t *,void *);
};
|
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
|
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
|
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
|
|