=Start=
缘由:
学习需要
正文:
参考解答:
alarm()+signal()/sigaction()实现的不那么精确的定时器功能
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h> /* struct timeval */
#include <time.h> /* time() */
#include <errno.h>
#include <inttypes.h>
#include <math.h>
void print_current_time_with_ms(void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n", (intmax_t)s, ms);
}
void sigalrm_fn(int sig)
{
print_current_time_with_ms();
alarm(2); // every 2 seconds
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(1); // first call ?
while(1)
pause();
return 0;
}
/* $ ./a.out
Current time: 1501747559.026 seconds since the Epoch
Current time: 1501747561.026 seconds since the Epoch
Current time: 1501747563.028 seconds since the Epoch
Current time: 1501747565.032 seconds since the Epoch
Current time: 1501747567.035 seconds since the Epoch
*/
setitimer()+sigaction()的一个实现
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
int limit = 10;
/* signal process */
void timeout_info(int signo)
{
if(limit == 0)
{
printf("Sorry, time limit reached.\n");
return;
}
printf("Only %d seconds left.\n", limit--);
}
/* init sigaction */
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler = timeout_info;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF, &act, NULL);
}
/* init */
void init_time(void)
{
struct itimerval val;
val.it_value.tv_sec = 1;
val.it_value.tv_usec = 0;
val.it_interval = val.it_value;
setitimer(ITIMER_PROF, &val, NULL);
}
int main(void)
{
init_sigaction();
init_time();
printf("You have only 10 seconds for thinking.\n");
while(1);
return 0;
}
多个setitimer()的示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <inttypes.h>
#include <math.h>
void print_current_time_with_ms(void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n", (intmax_t)s, ms);
}
int sec = 5;
void sigroutine(int signo){
switch (signo) {
case SIGALRM:
printf("Catch a signal -- SIGALRM\n");
print_current_time_with_ms();
signal(SIGALRM, sigroutine);
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM\n");
print_current_time_with_ms();
signal(SIGVTALRM, sigroutine);
break;
}
return;
}
int main() {
printf("process id is %d\n", getpid());
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
struct itimerval value, ovalue, value2; //(1)
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue); //(2)
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
for(;;)
;
return 0;
}
参考链接:
Linux定时器的使用
http://www.cppblog.com/jerryma/archive/2012/01/31/164704.html
linux下使用select实现精确定时器
http://www.cnblogs.com/jjdiaries/p/3404380.html
Linux下定时器的使用
http://www.jyguagua.com/?p=1700
=END=