за n миллисекунд, так как это займет 20 мс + X
Это всегда займет немного больше времени. Единственное, что вы можете сделать, это точно измерить интервал между выполнениями.
Использовать timer_create()
и указать интервал в 20 миллисекунд:
#define _GNU_SOURCE
#include <signal.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#define fatal(fmt, ...) do{ fprintf(stderr, "%d:%d" fmt "\n", __LINE__, errno, ##__VA_ARGS__); abort(); } while(0)
void method(union sigval sv) {
int *num = sv.sival_ptr;
printf("Hello %d\n", (*num)++);
}
int main() {
int ctx = 100;
struct sigevent sevp = {
.sigev_notify = SIGEV_THREAD,
.sigev_notify_function = method,
.sigev_value = {
.sival_ptr = &ctx,
},
};
timer_t tm;
int err = timer_create(CLOCK_MONOTONIC, &sevp, &tm);
if (err) fatal("timer_create");
const struct timespec ts_20_ms = {
.tv_sec = 0,
.tv_nsec = 20000000,
};
err = timer_settime(tm, 0, &(const struct itimerspec){
.it_interval = ts_20_ms,
.it_value = ts_20_ms,
}, NULL);
if (err) fatal("timer_settime");
usleep(1 * 1000 * 1000);
err = timer_delete(tm);
if (err) fatal("timer_delete");
exit(0);
}