Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350590
  • 博文数量: 106
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-10 08:32
文章分类

全部博文(106)

文章存档

2016年(11)

2015年(93)

2013年(2)

分类: C/C++

2015-08-21 15:04:12

Linux 定时器alarm()

(2010-06-11 10:09:17)
标签:

杂谈

分类: Linux

系统中的每个进程都有一个私有的闹钟。这个闹钟很像一个计时器,可以设置在一定秒数后闹钟。时间一到,时钟就发送一个信号SIGALRM到进程。

 

函数原型:unsigned int alarm(unsigned int seconds);
头文件:#include<unistd.h>
函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后,传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
返回值:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。 出错返回-1。

例1:

int main(int argc, char *argv[])
{

 unsigned int  timeleft;

 

 printf( "Set the alarm and sleep\n" );
 alarm( 10 );
 sleep( 5 );

 

 timeleft = alarm( 0 ); //获得上一个闹钟的剩余时间:5秒
 printf( "\Time left before cancel, and rearm: %d\n", timeleft );

 

 alarm( timeleft );

 

 printf( "\Hanging around, waiting to die\n" );
 pause(); //让进程暂停直到信号出现

 return EXIT_SUCCESS;

}

 

运行结果:

首先打印   Set the alarm and sleep

5秒后打印  Time left before cancel, and rearm: 5

           Hanging around, waiting to die

再经过5秒,程序结束


例2:

static void timer(int sig)
{
 static int count=0;
 count++;


 printf("\ncount = %d\n", count);

    if(sig == SIGALRM)
    {
        printf("timer\n");
    }

 

 signal(SIGALRM, timer);
 alarm(1);

 

  if (count == 5)
    alarm(0);
    return;
}

 

int main(int argc, char *argv[])
{
 signal(SIGALRM, timer);
 alarm(1);
 while(1);

}

 

除非进程为SIGALRM设置了处理函数,否则信号将杀死这个进程。比较下例中signal(SIGALRM, wakeup);语句打开与关闭的区别。

例3:

void wakeup()
{
 printf("Wake Up!\n");
}

void main(int argc, char *argv[])
{
 printf("sleep 3 seconds!\n");
 //signal(SIGALRM, wakeup);
 alarm(3);
 pause();
 printf("Waken!\n");
}

 

计时器的另一个用途是调度一个在将来的某个时刻发生的动作同时做些其他事情。调度一个将要发生的动作很简单,通过调用alarm来设置计时器,然后继续做别的事情。当计时器计时到0时,信号发送,处理函数被调用。

阅读(814) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~