參考資料:
https://man7.org/linux/man-pages/man7/signal.7.html
https://man7.org/linux/man-pages/man2/timer_create.2.html
https://man7.org/linux/man-pages/man2/timerfd_create.2.html
https://stackoverflow.com/questions/997946/how-to-get-current-time-and-date-in-c
https://stackoverflow.com/questions/65792258/clock-nanosleep-it-ignores-timespec-structure
https://stackoverflow.com/questions/69099750/what-is-the-precision-of-the-gettimeofday-function
取得目前時間 | 說明 |
---|---|
time | time_t (second) |
ftime | struct timeb (millisecond) |
gettimeofday | struct timeval (microsecond) |
clock_gettime | struct timespec (nanosecond) |
等待一段時間 |
---|
sleep |
alarm |
usleep |
nanosleep |
clock_nanosleep |
getitimer / setitimer |
timer_create / timer_settime / timer_gettime / timer_delete |
timerfd_create / timerfd_gettime / timerfd_settime |
time
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> int main(int argc, char **argv) { time_t t = time(NULL); struct tm *now = localtime(&t); printf("%d/%d/%d %d:%d:%d\n", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); return 0; }
ftime
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <sys/timeb.h> int main(int argc, char **argv) { struct timeb t; ftime(&t); printf("%ld(s), %d(ms)\n", t.time, t.millitm); return 0; }
gettimeofday
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <sys/time.h> int main(int argc, char **argv) { struct timeval t; struct timezone tz; gettimeofday(&t, &tz); printf("%ld(s), %ld(us)\n", t.tv_sec, t.tv_usec); return 0; }
clock_gettime
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> int main(int argc, char **argv) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); printf("%ld(s), %ld(ns)\n", t.tv_sec, t.tv_nsec); return 0; }
sleep、alarm
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <signal.h> void handle_signal(int sig) { printf("%s\n", __func__); } int main(int argc, char **argv) { signal(SIGALRM, handle_signal); alarm(3); pause(); sleep(3); return 0; }
usleep、nanosleep
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <signal.h> int main(int argc, char **argv) { struct timespec req = {0}; struct timespec rem = {0}; usleep(3000000); req.tv_sec = 3; req.tv_nsec = 0; nanosleep(&req, &rem); return 0; }
P.S. 依據man文件描述,usleep的輸入參數必須小於1000000
clock_nanosleep
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> int main(int argc, char **argv) { struct timespec req = {0}; struct timespec rem = {0}; req.tv_sec = 3; req.tv_nsec = 0; clock_nanosleep(CLOCK_REALTIME, 0, &req, &rem); return 0; }
setitimer
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> void handle_signal(int sig) { printf("%s\n", __func__); } int main(int argc, char **argv) { struct itimerval t = {0}; signal(SIGALRM, handle_signal); t.it_value.tv_sec = 3; setitimer(ITIMER_REAL, &t, NULL); pause(); return 0; }
timer_create
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> #include <sys/timerfd.h> void handle_signal(int sig) { printf("%s\n", __func__); } int main(int argc, char **argv) { timer_t fd = 0; struct sigevent ev = {0}; struct itimerspec ts = {0}; ev.sigev_value.sival_ptr = &fd; ev.sigev_notify = SIGEV_SIGNAL; ev.sigev_signo = SIGALRM; signal(SIGALRM, handle_signal); timer_create(CLOCK_REALTIME, &ev, &fd); ts.it_value.tv_sec = 3; timer_settime(fd, 0, &ts, NULL); pause(); timer_delete(&fd); return 0; }
timerfd_create
#include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> #include <sys/timerfd.h> int main(int argc, char **argv) { uint64_t exp = 0; struct timespec now = {0}; struct itimerspec t = {0}; int fd = timerfd_create(CLOCK_REALTIME, 0); clock_gettime(CLOCK_REALTIME, &now); t.it_value.tv_sec = now.tv_sec + 3; timerfd_settime(fd, TFD_TIMER_ABSTIME, &t, NULL); read(fd, &exp, sizeof(uint64_t)); printf("expired %ld\n", exp); return 0; }