代码:
#include<signal.h>
void work_function()
{
printf("timout signal received\n");
}
void main()
{
int i = 0;
struct sigaction timeoutsigact;
timeoutsigact.sa_handler = work_function;
sigemptyset(&timeoutsigact.sa_mask);
sigaddset(&timeoutsigact.sa_mask, SIGALRM);
sigaction(SIGALRM, &timeoutsigact, 0);
while(i = 0;i<10;I++)
{
alarm(1)
}
}
代码分析:
1 结构sigaction定义如下:
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。
sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。
sa_restorer 此参数没有使用。
sa_flags 用来设置信号处理的其他相关操作。
2 sigemptyset函数简介:
表头文件
#include<signal.h>
函数定义
int sigemptyset(sigset_t *set);
函数说明
sigemptyset()用来将参数set信号集初始化并清空。
返回值
执行成功则返回0,如果有错误则返回-1。
错误代码:EFAULT 参数set指针地址无法存取。
3 函数sigaction(查询或设置信号处理方式):
表头文件 #include<signal.h>
定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。
4 在POSIX兼容的平台上,SIGALRM是在定时器终止时发送给进程的信号。它们的符号常量在头文件signal.h中定义。在不同的平台上,信号
的编号可能发生变化,因此需要使用符号名称。SIG是信号名的通用前缀。ALRM是alarm的缩写,即定时器。使用计算机程序通常使用SIGALRM
作为长时间操作的超时信号,或提供一种隔一定时间间隔处理某些操作的方式。
SIGALRM通常在调用alarm(3)系统调用的整数秒之后产生。