alarm()函数
alarm开启定时器,时间到后给调用alarm的进程发送一个SIGALRM信号。
默认情况下,会终止当前进程。
可以将信号到来动作修改为自定义处理方法
方法一
sighandler_t signal(int signum, sighandler_t handler);
第一个参数信号值 ,第二个参数 信号处理函数的 函数指针
#include <signal.h>
#include <stdio.h>
void handler(int arg){
printf("alarm sign\n");
}
int main(int argc, const char *argv[])
{
signal(SIGALRM, handler);
//对SIGALRM信号重新设置了处理函数
alarm(2);
while(1);
return 0;
}
方法二
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (sa_sigaction)(int, siginfo_t , void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
#include<stdio.h>
#include <signal.h>
#include <stdlib.h>
void handler(int a){
printf("sign come");
}
int main(int argc, const char *argv[])
{
char arr[10];
struct sigaction old_sigation;
if(sigaction(SIGALRM,NULL,&old_sigation)<0){
}
old_sigation.sa_handler = handler;
old_sigation.sa_flags =~(SA_RESTART) & old_sigation.sa_flags;
if(sigaction(SIGALRM,&old_sigation,NULL)<0){
}
alarm(2);
printf("alarm \n");
char* a = fgets(arr,10,stdin);
if(a==NULL){
printf("fgets == NULL");
}
fgets(arr,10,stdin);
return 0;
}
将SIGALRM 去除重启 SA_RESTART参数,这样距离alarm()最近的 有阻塞IO的函数立刻执行(当然此处fgets的结果就是NULL了),但下一个函数(第二个fgets)不会结束阻塞。
运行的结果是
alarm
fgets == NULL
光标闪烁(进入第二个fgets 阻塞)