下面看一下这个信号结构体。
struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_sigaction)(int, siginfo_t *, void *);
};
在使用的时候,sa_handler和sa_sigaction只是用一个。
sa_mask是和sa_handler一起的。
sa_mask表示了一个信号集合,在调用sigaction之前要先用sigemptyset把sa_mask加入到进程的信号屏蔽字当中。
sigemptyset函数初始化一个sigset_t *类型的信号集合,清除里面的所有信号。
使用函数sigaction(SIGALRM, &tact, NULL)就是把SIGALRM的信号的触发动作变成tact结构体中的sa_handler或者sa_sigaction所指向的函数了。
例子如下,每隔2秒钟打印一行字。
一个函数用来设置信号相关的函数绑定,一个函数用来初始化定时器并且启动它。
然后程序需要运行很久,放到死循环里面去,才能看出来效果,一般的应用程序,都不会自动退出的,往往是永远不退出,或者是等待用户关闭它。
#include
#include
#include
#include
#include
staticcharmsg[] ="time is running out.\n";
staticintlen;
voidprompt_info(intsigno)
{
write(STDERR_FILENO, msg, len);
}
voidinit_sigaction(void)
{
structsigaction tact;
tact.sa_handler = prompt_info;
tact.sa_flags = 0;
sigemptyset(&tact.sa_mask);
sigaction(SIGALRM, &tact, NULL);
}
voidinit_time()
{
structitimerval value;
value.it_value.tv_sec = 2;
value.it_value.tv_usec = 0;
value.it_interval = value.it_value;
setitimer(ITIMER_REAL, &value, NULL);
}
intmain()
{
len = strlen(msg);
init_sigaction();
init_time();
while(1);
exit(0);
}