UNIX(编程-信号处理):06---alarm、ualarm定时函数(SIGALRM信号)

一、alarm函数

#include 
unsigned int alarm(unsigned int seconds);
  • 功能:使用alarm函数可以设置一个时间值(闹钟时间),当执行到该函数之后开始计时,超时时产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程 
  • 参数:
    • 定时秒数(以秒为单位)
    • 如果秒为零,则取消任何挂起的警报。在任何情况下,任何先前设置的报警都会被取消
  • 返回值:
    • 成功:第一次调用返回0,不是第一次调用返回以前设置的闹钟时间的余留秒数
    • 失败:非0
  • 注意事项:
    • 参数seconds的值是产生SIGALRM需要经过的时钟秒数。当这一时刻达到时,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一定的时间间隔
    • 如果我们想要捕捉SIGALRM信号,并且处理SIGALRM信号,必须在alarm之前书写该信号的处理函数

演示案例

#include
#include
int main(void)
{
    printf("first time return:%d\n",alarm(4));
    sleep(1);	
    printf("after sleep(1),remain:%d\n",alarm(2));
    printf("renew alarm,remain:%d\n",alarm(1));
}
  • 演示结果

UNIX(编程-信号处理):06---alarm、ualarm定时函数(SIGALRM信号)_第1张图片

二、ualarm函数

#include 
useconds_t ualarm(useconds_t usecs, useconds_t interval);
  • 功能:在usecs微秒后,将SIGALRM信号发送给进程,并且之后每隔interval微秒再发送一次SIGALRM信号。如果不对SIGALRM信号进程处理,默认操作是终止进程
  • 延迟可能会因任何系统活动、处理调用所花费的时间或系统计时器的粒度而略微延长
  • 参数:
    • usecs:第一次触发SIGALRM信号的时间
    • interval:第一次触发SIGALRM信号之后每隔interval微秒再触发一次SIGALRM信号
    • 以微秒为单位
  • 返回值:此函数返回以前设置的任何警报的剩余微秒数。如果没有挂起警报,则返回0(第一次调用该函数也返回0)。常见的errno如下:
    • EINTR:被一个信号打断了

    • EINVAL:usecs或interval不小于1000000(在被认为是错误的系统上)

演示案例 

#include
#include
#include
#include

void handler()
{
    printf("int:hello\n");
}

int main()
{
    int i;
    signal(SIGALRM,handler);
    //因为是第一次设置,所以返回0
    printf("%d\n",ualarm(500000,200000));

    while(1)
        pause();

    return 0;
}
  • 运行结果如下所示

UNIX(编程-信号处理):06---alarm、ualarm定时函数(SIGALRM信号)_第2张图片 

 

你可能感兴趣的:(UNIX(编程-信号处理))