alarm()函数 SIGALRM信号的使用

本文介绍如何利用C语言中的alarm函数设置定时器,并通过两种方法自定义SIGALRM信号的处理方式:一是使用signal函数进行简单设置;二是采用sigaction函数实现更复杂的控制,包括去除重启参数SA_RESTART的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值