alarm()函数 SIGALRM信号的使用

alarm()函数

alarm开启定时器,时间到后给调用alarm的进程发送一个SIGALRM信号。
默认情况下,会终止当前进程。
可以将信号到来动作修改为自定义处理方法

方法一

sighandler_t signal(int signum, sighandler_t handler);
第一个参数信号值 ,第二个参数 信号处理函数的 函数指针

#include 
#include 
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
#include 
#include 

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 阻塞)

你可能感兴趣的:(linux,alarm-函数,SIGALRM)