sleep下面我们来看看用sleep以及usleep怎么实现定时执行任务。 - #include <signal.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdio.h>
- static char msg[] = "I received a msg.\n";
- int len;
- void show_msg(int signo)
- {
- write(STDERR_FILENO, msg, len);
- }
- int main()
- {
- struct sigaction act;
- union sigval tsval;
- act.sa_handler = show_msg;
- act.sa_flags = 0;
- sigemptyset(&act.sa_mask);
- sigaction(50, &act, NULL);
- len = strlen(msg);
- while ( 1 )
- {
- sleep(2); /*睡眠2秒*/
- /*向主进程发送信号,实际上是自己给自己发信号*/
- sigqueue(getpid(), 50, tsval);
- }
- return 0;
- }
看到了吧,这个要比上面的简单多了,而且你用秒表测一下,时间很准,指定2秒到了就给你输出一个字符串。所以,如果你只做一般的定时,到了时间去执行一个任务,这种方法是最简单的。 时间差下面我们来看看,通过自己计算时间差的方法来定时: - #include <signal.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdio.h>
- #include <time.h>
- static char msg[] = "I received a msg.\n";
- int len;
- static time_t lasttime;
- void show_msg(int signo)
- {
- write(STDERR_FILENO, msg, len);
- }
- int main()
- {
- struct sigaction act;
- union sigval tsval;
- act.sa_handler = show_msg;
- act.sa_flags = 0;
- sigemptyset(&act.sa_mask);
- sigaction(50, &act, NULL);
- len = strlen(msg);
- time(&lasttime);
- while ( 1 )
- {
- time_t nowtime;
- /*获取当前时间*/
- time(&nowtime);
- /*和上一次的时间做比较,如果大于等于2秒,则立刻发送信号*/
- if (nowtime - lasttime >= 2)
- {
- /*向主进程发送信号,实际上是自己给自己发信号*/
- sigqueue(getpid(), 50, tsval);
- lasttime = nowtime;
- }
- }
- return 0;
- }
这个和上面不同之处在于,是自己手工计算时间差的,如果你想更精确的计算时间差,你可以把 time 函数换成gettimeofday,这个可以精确到微妙。 上面介绍的几种定时方法各有千秋,在计时效率上、方法上和时间的精确度上也各有不同,采用哪种方法,就看你程序的需要。
|