NAVN
- Provided by: manpages-da-dev (Version: 4.31.0-1)
- Source: manpages-l10n
- Report a bug
C-standardbibliotek (libc, -lc)
#include <sys/timerfd.h>
int timerfd_create(int clockid, int flag);
int timerfd_settime(int fd, int flag,
const struct itimerspec *ny_værdi,
struct itimerspec *_Nullable gl_værdi);
int timerfd_gettime(int fd, struct itimerspec *nuv_værdi);
Disse systemkald opretter og fungerer på et stopur, der leverer påmindelser om udløb for stopure via en fildeskriptor. De tilbyder et alternativ til brugen af setitimer(2) eller timer_create(2), med den fordel at fildeskriptoren kan overvåges af select(2), poll(2) og epoll(7).
Brugen af disse tre systemkald er analog til brugen af timer_create(2), timer_settime(2) og timer_gettime(2). (Der er ingen analog for timer_getoverrun(2) da den funktionalitet tilbydes af read(2), som beskrevet nedenfor).
timerfd_create() opretter et nyt stopurobjekt og returnerer en fildeskriptor, der referer til det stopur. Argumentet clockid angiver uret, der bruges til at markere status for stopuret, og skal være en af de følgende:
Se clock_getres(2) for yderligere detaljer om ovenstående ure.
Den nuværende værdi af hver af disse ure kan indhentes via clock_gettime(2).
Startende med Linux 2.6.27 kan de følgende værdier blive bit-vis ORed i flag for at ændre opførelsen for timerfd_create():
I Linuxversioner op til og inklusive 2.6.26 skal flag være angivet som nul.
timerfd_settime() bevæbner (starter) eller afvæbner (stopper) stopuret refereret til af fildeskriptoren fd.
Arguementet ny_værdi angiver det oprindelige udløb og interval for stopuret. Strukturen itimerspec brugt for dette argument er beskrevet i itimerspec(3type).
new_value.it_value angiver det oprindelige udløb for stopuret, i sekunder og nanosekunder. Angivelse af et af felterne i new_value.it_value til en værdi anderledes end nul bevæbner stopuret. Angivelse af begge felter i new_value.it_value til nul afvæbner stopuret.
Angivelse af et eller begge felter i new_value.it_interval til værdier forskellige fra nul angiver perioden, i sekunder og nanosekunder, for gentagne stopursudløb efter det oprindelige udløb. Hvis begge felter i new_value.it_interval er nul, så udløber stopuret bare en gang, på tidspunktet angivet af new_value.it_value.
Som standard fortolkes den oprindelige udløbstid angivet i ny_værdi relativ til den nuværende tid på stopurets ur på tidspunktet for kaldet (dvs. new_value.it_value angiver en tid relativ til den nuværende værdi for uret angivet af clockid). Et absolut tidsudløb kan vælges via argumentet flag.
Argumentet flag er en bit-maske, der kan inkludere de følgende værdier:
Hvis argumentet gl_værdi ikke er NULL, så bruges strukturen itimerspec der peges på til at returnere indstillingen for stopuret, der var gyldig på tidspunktet for kaldet; se beskrivelsen af timerfd_gettime() der følger.
timerfd_gettime() returnerer, i nuv_værdi, en itimerspec-struktur der indheolder den nuværende indstilling for stopuret refereret til af fildeskriptoren fd.
Feltet it_value returnerer tidsintervallet indtil stopuret næste gang udløber. Hvis begge felter for denne struktur er nul, så er stopuret afvæbnet. Dette felt indeholder en relativ værdi, uanset om flaget TFD_TIMER_ABSTIME var angivet da stopuret blev indstillet.
Feltet it_interval returnerer intervallet for stopuret. Hvis begge felter for denne struktur er nul, så er stopuret sat til at udløb bare en gang, på tidspunktet angivet af curr_value.it_value.
Fildeskriptoren returneres af timerfd_create() understøtter de følgende yderligere operationer:
Efter en fork(2) arver underprocessen en kopi af fildeskriptoren oprettet af timerfd_create(). Fildeskriptoren refererer til det samme underliggende stopursobjekt som den tilsvarende fildeskriptor i overprocessen, og read(2)'er i underprocessen vil returnere information om udløb for stopuret.
En fildeskriptor oprettet af timerfd_create() bevares på tværs af execve(2), og fortsætter med at oprette stopursudløb hvis stopuret var bevæbnet.
Ved succes, returnerer timerfd_create() en ny fildeskriptor. Ved fejl, returneres -1 og errno angives for at indikere fejlen.
timerfd_settime() og timerfd_gettime() returnerer 0 ved succes; ved fejl returnerer de -1, og angiver errno for at indikere fejlen.
timerfd_create() kan fejle med de følgende fejlbeskeder:
timerfd_settime() og timerfd_gettime() kan fejle med de følgende fejl:
timerfd_settime() kan også fejl med de følgende fejl:
Linux.
Linux 2.6.25, glibc 2.8.
Hvis vi antager det følgende scenarie for CLOCK_REALTIME- eller CLOCK_REALTIME_ALARM-stopuret, der blev oprettet med timerfd_create():
I dette tilfælde sker der det følgende:
I øjeblikket understøtter timerfd_create() færre typer af ur-id'er end timer_create(2).
Det følgende program opretter et stopur og overvåger så dets status. Programmet accepterer op til tre kommandolinjeargumenter. Det første argument angiver antallet af sekunder for et oprindelige udløb for stopuret. Det andet argument angiver intervallet for stopuret, i sekunder. Det tredje argument angiver antallet af gange programmet bør tillade at stopuret udløber før afslutning. Det andet og det tredje kommandolinjeargument er valgfrie.
Den følgende skalsession demonstrerer brugen af programmet:
$ a.out 3 1 100 0.000: timer started 3.000: read: 1; total=1 4.000: read: 1; total=2 ^Z # tast control-Z for at suspendere programmet [1]+ Stopped ./timerfd3_demo 3 1 100 $ fg # Genoptag afvikling efter nogle få sekunder a.out 3 1 100 9.660: read: 5; total=7 10.000: read: 1; total=8 11.000: read: 1; total=9 ^C # tast control-C for at suspendere programmet
#include <err.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/timerfd.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
static void
print_elapsed_time(void)
{
int secs, nsecs;
static int first_call = 1;
struct timespec curr;
static struct timespec start;
if (first_call) {
first_call = 0;
if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
err(EXIT_FAILURE, "clock_gettime");
}
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1)
err(EXIT_FAILURE, "clock_gettime");
secs = curr.tv_sec - start.tv_sec;
nsecs = curr.tv_nsec - start.tv_nsec;
if (nsecs < 0) {
secs--;
nsecs += 1000000000;
}
printf("%d.%03d:\t", secs, (nsecs + 500000) / 1000000);
}
int
main(int argc, char *argv[])
{
int fd;
ssize_t s;
uint64_t expir, tot_expir, max_expir;
struct timespec now;
struct itimerspec new_value;
if (argc != 2 && argc != 4) {
fprintf(stderr, "%s init-secs [interval-secs max-num-expir]\n",
argv[0]);
exit(EXIT_FAILURE);
}
if (clock_gettime(CLOCK_REALTIME, &now) == -1)
err(EXIT_FAILURE, "clock_gettime");
/* Opret et CLOCK_REALTIME-absolut stopur med oprindelig
udløb og interval som angivet på kommandolinjen. */
new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);
new_value.it_value.tv_nsec = now.tv_nsec;
if (argc == 2) {
new_value.it_interval.tv_sec = 0;
max_expir = 1;
} else {
new_value.it_interval.tv_sec = atoi(argv[2]);
max_expir = atoi(argv[3]);
}
new_value.it_interval.tv_nsec = 0;
fd = timerfd_create(CLOCK_REALTIME, 0);
if (fd == -1)
err(EXIT_FAILURE, "timerfd_create");
if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1)
err(EXIT_FAILURE, "timerfd_settime");
print_elapsed_time();
printf("timer started\n");
for (tot_expir = 0; tot_expir < max_expir;) {
s = read(fd, &expir, sizeof(uint64_t));
if (s != sizeof(uint64_t))
err(EXIT_FAILURE, "read");
tot_expir += expir;
print_elapsed_time();
printf("read: %w64u; total=%w64u\n", expir, tot_expir);
}
exit(EXIT_SUCCESS);
}
eventfd(2), poll(2), read(2), select(2), setitimer(2), signalfd(2), timer_create(2), timer_gettime(2), timer_settime(2), timespec(3), epoll(7), time(7)
Oversættere af denne manual til dansk Joe Hansen <joedalton2@yahoo.dk>
Denne oversættelse er gratis dokumentation; læs GNU General Public License version 3 eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR.
Hvis du støder på fejl i oversættelsen af denne vejledning, skal du sende en besked til debian-l10n-danish@lists.debian.org.