免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1230 | 回复: 0
打印 上一主题 下一主题

linux中的定时 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-04 20:12 |只看该作者 |倒序浏览

                                #include  
unsigned int alarm(unsigned int seconds);
系 统调用alarm安排内核为调用进程在指定的seconds秒后发出一个SIGALRM的信号。默认动作是终止调用进程,可以捕获信号在超时后执行我们用signal设定的信号处理函数。后一次设定将取消前一次的设定。如果指定的参数seconds为0,则不再发送 SIGALRM信号,所以可用参数0取消先前设置的alarm定时器。该调用返回值为上次定时调用到发送之间剩余的时间,或者因为没有前一次定时调用而返回0。
注意,在使用时,alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用。 alarm不挂起调用进程。有时需要调用alarm后使进程挂起,这时可以在调用pause函数,该函数使进程休眠,直到接收到一个信号(任何信号)并从信号处理程序返回时才唤醒进程。
如果不要求很精确的话,用alarm()和signal()就够了。
               
               
                void sigalrm_fn(int sig)
{    printf("alarm!\n");
    alarm(2);                        //alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用
    return;
}
int main(void)
{    signal(SIGALRM, sigalrm_fn);
    alarm(1);
    while(1) pause();
}
#include  
unsigned int sleep(unsigned int seconds); 被中断返回未休眠够的秒数,超时到返回0
挂起调用进程,直到定时时间到或者捕捉到一个信号(此信号不能是被忽略的信号)并从信号处理程序返回。此函数一般用来使进程挂起指定时间,不能设定信号处理函数,所以不能用来超时后执行特定动作。一般不作为定时器。
#include
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
如果函数的第2、3、4这三个指针参数均为null,则select提供了比select更精确的定时器,因为sleep等待整数秒,而struct timeval结构精确到毫秒。定时器将阻塞进程直到超时(返回0)或者被信号中断(返回-1)。此函数一般用来使进程挂起指定时间,不能设定信号处理函数,所以不能用来超时后执行特定动作。一般不作为定时器。
timeout参数指向的struct timeval结构不一定返回剩余的秒数,如果我们需要这个值,必须在调用select前取得系统时间,返回后再取得系统时间,两者相减。
#include
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,setitimer() 为Linux的API,并非C语言的Standard Library
参数:
which:间歇计时器类型,有三种选择
ITIMER_REAL //数值为0, 以系统真实的时间来计算,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,以该进程在用户态下花费的时间来计算,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2, 以该进程在用户态下和内核态下所费的时间来计算,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
value,ovalue:时间参数,原型如下
struct itimerval {
    struct timeval it_interval; /* 计时器重启动的间歇值 */
    struct timeval it_value;    /* 计时器安装后首先启动的初始值 */
};
struct timeval {
    long tv_sec;                /* 秒 */
    long tv_usec;               /* 微妙(1/1000000) */
};
int getitimer(int which, struct itimerval *value);//用计时器的当前值填写value指向的结构体。
20#include stdio.h>    // for printf()
21#include unistd.h>   // for pause()
22#include signal.h>   // for signal()
23#include string.h>   // for memset()
24#include sys/time.h> // struct itimeral. setitimer()
25
26void printMsg(int);
27
28int main() {
29  // Get system call result to determine successful or failed
30  int res = 0;
31  // Register printMsg to SIGALRM
32  signal(SIGALRM, printMsg)
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103462/showart_2086461.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP