寫完上面那篇之後,仔細想想 #1IGT3gmB (C_and_CPP) 好歹也是我寫的,
用那種舊的 alarm() 好像有點掉漆,用新的 timer_ 系列和 nanosleep()
感覺起來就高級很多,而且我把速度調到十倍快,「體感」效能有增加。
$ cat alarm2.c
/* https://ideone.com/9tXyDU */
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <time.h>
int n=0;
timer_t timerid;
void beep(sigval_t sig)
{
struct itimerspec timeval;
printf("%d x %d = %d\n", n/8+2, n%8+2, (n/8+2)*(n%8+2));
n++;
if (n>=64) {
memset(&timeval, 0, sizeof(timeval));
timer_settime(timerid, 0, &timeval, NULL);
}
}
int main(void)
{
struct sigevent sigev;
struct itimerspec timeval;
struct timespec ts;
memset(&sigev, 0, sizeof(sigev));
sigev.sigev_notify = SIGEV_THREAD;
sigev.sigev_notify_function = beep;
timeval.it_interval.tv_sec = 0;
timeval.it_interval.tv_nsec = 100000000;
timeval.it_value.tv_sec = 0;
timeval.it_value.tv_nsec = 100000000;
timer_create(CLOCK_MONOTONIC, &sigev, &timerid);
timer_settime(timerid, 0, &timeval, NULL);
ts.tv_sec = 7;
ts.tv_nsec = 0;
nanosleep(&ts, NULL);
timer_delete(timerid);
return 0;
}
$ gcc -lrt alarm2.c
$ ./a.out
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
6 x 2 = 12
6 x 3 = 18
6 x 4 = 24
6 x 5 = 30
6 x 6 = 36
6 x 7 = 42
6 x 8 = 48
6 x 9 = 54
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
8 x 2 = 16
8 x 3 = 24
8 x 4 = 32
8 x 5 = 40
8 x 6 = 48
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81