.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH timer_create 2 "29. oktober 2025" "Linux man\-pages 6.17" .SH NAVN timer_create \- opret et POSIX per proces\-stopur .SH BIBLIOTEK Real\-time library (\fIlibrt\fP,\ \fI\-lrt\fP) .SH SYNOPSIS .nf \fB#include \fP /* Definition af \fBSIGEV_*\fP\-konstanter */ \fB#include \fP .P \fBint timer_create(clockid_t \fP\fIclockid\fP\fB,\fP \fB struct sigevent *_Nullable restrict \fP\fIsevp\fP\fB,\fP \fB timer_t *restrict \fP\fItimerid\fP\fB);\fP .fi .P .RS -4 Feature Test Macro Requirements for glibc (se \fBfeature_test_macros\fP(7)): .RE .P \fBtimer_create\fP(): .nf _POSIX_C_SOURCE >= 199309L .fi .SH BESKRIVELSE \fBtimer_create\fP() opretter et nyt per proces\-intervalstopur. Id'et for det nye stopur returneres i mellemlageret der peger på \fItimerid\fP, der skal være en ikke\-null peger. Dette id er unik i processen, indtil stopuret slettes. Det nye stopur er oprindelig afvæbnet. .P Argumentet \fIclockid\fP angiver uret, som det nye stopur bruger til at måle tiden. Kan angives som en af de følgende værdier: .TP \fBCLOCK_REALTIME\fP Et realtids ur, der kan angives for hele systemet. .TP \fBCLOCK_MONOTONIC\fP .\" Note: the CLOCK_MONOTONIC_RAW clock added for clock_gettime() .\" in Linux 2.6.28 is not supported for POSIX timers -- mtk, Feb 2009 Et monotont stigende ur, der ikke kan indstilles og som måler tid fra et uangivet punkt i fortiden, der ikke ændrer sig efter systemets opstartstidspunkt. .TP \fBCLOCK_PROCESS_CPUTIME_ID\fP (siden Linux 2.6.12) Et ur der måler (bruger og system) cpu\-tid forbrugt af (alle trådene i) den kaldende proces. .TP \fBCLOCK_THREAD_CPUTIME_ID\fP (siden Linux 2.6.12) .\" The CLOCK_MONOTONIC_RAW that was added in Linux 2.6.28 can't be used .\" to create a timer -- mtk, Feb 2009 Et ur der måler (bruger og system) cpu\-tid forbrugt af den kaldende tråd. .TP \fBCLOCK_BOOTTIME\fP (siden Linux 2.6.39) .\" commit 70a08cca1227dc31c784ec930099a4417a06e7d0 Som \fBCLOCK_MONOTONIC\fP, er dette et monotont stigende ur. Hvor \fBCLOCK_MONOTONIC\fP ikke måler tiden mens et system er i dvale, så inkluderer \fBCLOCK_BOOTTIME\fP tiden hvor systemet er i dvale. Dette er nyttigt for programmer, der skal være dvale\-opmærksomme. \fBCLOCK_REALTIME\fP er ikke egnet for sådanne programmer, da uret påvirkes af diskontinuerlige ændringer til systemuret. .TP \fBCLOCK_REALTIME_ALARM\fP (siden Linux 3.0) .\" commit 9a7adcf5c6dea63d2e47e6f6d2f7a6c9f48b9337 Dette ur er som \fBCLOCK_REALTIME\fP, men vil vække systemet, hvis det er i dvale. Kalderen skal have funktionaliteten \fBCAP_WAKE_ALARM\fP for at angive et stopur mod dette ur. .TP \fBCLOCK_BOOTTIME_ALARM\fP (siden Linux 3.0) .\" commit 9a7adcf5c6dea63d2e47e6f6d2f7a6c9f48b9337 Dette ur er som \fBCLOCK_BOOTTIME\fP, men vil vække systemet, hvis det er i dvale. Kalderen skal have funktionaliteten \fBCAP_WAKE_ALARM\fP for at kunne angive et stopur mod dette ur. .TP \fBCLOCK_TAI\fP (siden Linux 3.10) Et ur for systemet udledt fra wall\-clock\-tiden men som tæller springende sekunder. .P Se \fBclock_getres\fP(2) for yderligere detaljer om ovenstående ure. .P Udover de ovenstående værdier kan \fIclockid\fP angives som \fIclockid\fP returneret af et kald til \fBclock_getcpuclockid\fP(3) eller \fBpthread_getcpuclockid\fP(3). .P Argumentet \fIsevp\fP peget på en \fIsigevent\fP\-struktur, der angiver hvordan kalderen skal blive påmindet når stopuret udløber. For defintionen og generelle detaljer for denne struktur, se \fBsigevent\fP(3type). .P Feltet \fIsevp.sigev_notify\fP kan have de følgende værdier: .TP \fBSIGEV_NONE\fP Påmind ikke asynkront når stopuret udløber. Status for stopuret kan overvåges via \fBtimer_gettime\fP(2). .TP \fBSIGEV_SIGNAL\fP Ved stopursudløb opret signalet \fIsigev_signo\fP for processen. Se \fBsigevent\fP(3type) for generellle detaljer. Feltet \fIsi_code\fP for strukturen \fIsiginfo_t\fP vil blive angivet til \fBSI_TIMER\fP. På ethvert tidspunkt er mindst et signal i kø til processen for et angivet stopur; se \fBtimer_getoverrun\fP(2) for yderligere detaljer. .TP \fBSIGEV_THREAD\fP Ved stopursudløb, igangsæt \fIsigev_notify_function\fP som var det startfunktionen for en ny tråd. Se \fBsigevent\fP(3type) for detaljer. .TP \fBSIGEV_THREAD_ID\fP (Linux\-specifik) Som for \fBSIGEV_SIGNAL\fP, men signalet er målrettet tråden hvis id er angivet i \fIsigev_notify_thread_id\fP, der skal være en tråd i den samme proces som kalderen. Feltet \fIsigev_notify_thread_id\fP angiver en kernetråd\-id, det vil issge, værdien returneret af \fBclone\fP(2) eller \fBgettid\fP(2). Dette flag er kun lavet for brug af trådbiblioteker. .P Angivelse af \fIsevp\fP som NULL svarer til at angive en peger til en \fIsigevent\fP\-struktur hvori \fIsigev_notify\fP er \fBSIGEV_SIGNAL\fP, \fIsigev_signo\fP er \fBSIGALRM\fP og \fIsigev_value.sival_int\fP er stopur\-id'et. .SH RETURVÆRDI Ved succes, \fBtimer_create\fP() returnerer 0 og id'et for det nye stopur er placeret i \fI*timerid\fP. Ved fejl, \-1 returneres og \fIerrno\fP angives for at indikere fejlen. .SH FEJL .TP \fBEAGAIN\fP Midlertidig fejl under kerneallokering af stopurstrukturer. .TP \fBEINVAL\fP Ur\-id, \fIsigev_notify\fP, \fIsigev_signo\fP eller \fIsigev_notify_thread_id\fP er ugyldig. .TP \fBENOMEM\fP .\" glibc layer: malloc() Kunne ikke allokere hukommelse. .TP \fBENOTSUP\fP Kernen understøtter ikke oprettelse af et stopur mod dette \fIclockid\fP. .TP \fBEPERM\fP \fIclockid\fP var \fBCLOCK_REALTIME_ALARM\fP eller \fBCLOCK_BOOTTIME_ALARM\fP men kalderen havde ikke funktionaliteten \fBCAP_WAKE_ALARM\fP. .SH VERSIONER .SS C\-bibliotek/kerne\-forskelle .\" See nptl/sysdeps/unix/sysv/linux/timer_create.c Dele af implementeringen af POSIX\-stopurs\-API'en tilbydes af glibc. Specielt: .IP \[bu] 3 Meget af funktionaliteten for \fBSIGEV_THREAD\fP er implementeret i glibc, frem for i kernen. (Dette er nødvendigt da tråden involveret i at håndtere påmindelsen er en, der skal håndteret af C\-bibliotekets POSIX\-trådimplementering). Selvom påmindelsen leveret til processen er via en tråd, så bruger NPTL\-implementeringen internt en \fIsigev_notify\fP\-værdi sammen med et realtids signal, der er reserveret af implementeringen (se \fBnptl\fP(7)). .IP \[bu] Implementeringen af standardtilfældet hvor \fIevp\fP er NULL håndteres inde i glibc, der igangsætter det underliggende systemkald med egnet udfyldt \fIsigevent\fP\-struktur. .IP \[bu] .\" See the glibc source file kernel-posix-timers.h for the structure .\" that glibc uses to map user-space timer IDs to kernel timer IDs .\" The kernel-level timer ID is exposed via siginfo.si_tid. Stopur\-id'et præsenteret på brugerniveau vedligeholdes af glibc, der oversætter disse id'er til stopurets id'er anvendt af kernen. .SH STANDARDER POSIX.1\-2024. .SH HISTORIK Linux 2.6. POSIX.1\-2001. .P .\" glibc commit 93a78ac437ba44f493333d7e2a4b0249839ce460 Før Linux 2.6 tilbød glibc en ufuldstændig brugerrumsimplementering (kun \fBCLOCK_REALTIME\fP\-stopure) via POSIX\-tråde og før glibc 2.17, benytter implementeringen denne teknik på systemer, der afvikler kerner ældre end Linux 2.6. .SH NOTER Et program kan oprette flere intervalstopure via \fBtimer_create\fP(). .P Stopure arves ikke af underprocessen for en \fBfork\fP(2), og afvæbnes og slettes under en \fBexecve\fP(2). .P Kernen præallokerer et »køet realtids signal« for hvert stopur oprettet via \fBtimer_create\fP(). Som konsekvens er antallet af stopure begrænset af ressourcebegrænsningen \fBRLIMIT_SIGPENDING\fP (se \fBsetrlimit\fP(2)). .P Stopurene oprettet af \fBtimer_create\fP() kendes ofte som »POSIX\-(interval)stopure. POSIX\-stopurs\-API'en består af de følgende grænseflader: .TP \fBtimer_create\fP() Opret et stopur. .TP \fBtimer_settime\fP(2) Bevæbn (start) eller afvæbn (stop) et stopur. .TP \fBtimer_gettime\fP(2) Hent tilbageværende tid indtil det næste udløb for et stopur, sammen med intervalindstillingen for stopuret. .TP \fBtimer_getoverrun\fP(2) Returner overløbsantallet for det sidste stopursudløb. .TP \fBtimer_delete\fP(2) Afvæbn og slet et stopur. .P Siden Linux 3.10 kan filen \fI/proc/\fPpid\fI/timers\fP bruges til at vise POSIX\-stoprurene for processen med PID \fIpid\fP. Se \fBproc\fP(5) for yderligere information. .P .\" baa73d9e478ff32d62f3f9422822b59dd9a95a21 Siden Linux 4.10 er understøttelse for POSIX\-stopure et tilvalg, der kan konfigureres og er aktiveret som standard. Kerneunderstøttelse kan deaktiveres via tilvalget \fBCONFIG_POSIX_TIMERS\fP. .SH EKSEMPLER Programmet nednefor bruger to argumenter: en soveperiode i sekunder og en stopursfrekvens i nanosekunder. Programmet etablerer et håndtag for signalet, det bruger for stopuret, blokerer det signal, opretter og bevæbner et stopur, der udløber med den anførte frekvens, sover i det anførte antal sekunder og fjerner så blokeringen på stopurssignalet. Under antagelse af at stopuret udløb mindst en gang mens programmet sov, vil signalhåndteringen blive igangsat og håndteringen viser lidt information om stopurspåmindelsen. Programmet afslutter efter en igangsættelse af signalhåndteringen. .P I det følgende eksempel sover programmet i 1 sekund, efter et stopur er oprettet med en frekvens på 100 nanosukneder. På det tidspunkt hvor signalet får fjernet og leveret sit signal, har der været omkring ti millioner overløb. .P .in +4n .EX $\fB ./a.out 1 100\fP; Etablerer håndtering for signal 34 Blokerer signal 34 stopur\-id er 0x804c008 Sover i 1 sekund Fjerner blokering for signal 34 Fangede signal 34 sival_ptr = 0xbfb174f4; *sival_ptr = 0x804c008 overløbsantal = 10004886 .EE .in .SS Programkilde .\" SRC BEGIN (timer_create.c) \& .EX #include #include #include #include #include #include #include \& #define CLOCKID CLOCK_REALTIME #define SIG SIGRTMIN \& static void print_siginfo(siginfo_t *si) { int or; timer_t *tidp; \& tidp = si\->si_value.sival_ptr; \& printf(" sival_ptr = %p; ", si\->si_value.sival_ptr); printf(" *sival_ptr = %#jx\[rs]n", (uintmax_t) *tidp); \& or = timer_getoverrun(*tidp); if (or == \-1) err(EXIT_FAILURE, "timer_getoverrun"); \& printf(" overrun count = %d\[rs]n", or); } \& static void handler(int sig, siginfo_t *si, void *uc) { /* Bemærk: kald af printf() fra en signalhåndtering er ikke sikkert (og bør ikke gøres i produktionsprogrammer), da printf() ikke er asynkron\-signal\-sikker; se signal\-safety(7). Alligevel så bruger vi printf() her som en simpel måde at vise at håndteringen blev kaldt. */ \& printf("Caught signal %d\[rs]n", sig); print_siginfo(si); signal(sig, SIG_IGN); } \& int main(int argc, char *argv[]) { timer_t timerid; sigset_t mask; long long freq_nanosecs; struct sigevent sev; struct sigaction sa; struct itimerspec its; \& if (argc != 3) { fprintf(stderr, "Brug: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& /* Etabler håndtering for stopurssignal. */ \& printf("Etablerer håndtering for signal %d\[rs]n", SIG); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); if (sigaction(SIG, &sa, NULL) == \-1) err(EXIT_FAILURE, "sigaction"); \& /* Bloker stopursignalet midlertidigt. */ \& printf("Blokerer signal %d\[rs]n", SIG); sigemptyset(&mask); sigaddset(&mask, SIG); if (sigprocmask(SIG_SETMASK, &mask, NULL) == \-1) err(EXIT_FAILURE, "sigprocmask"); \& /* Opret stopuret. */ \& sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIG; sev.sigev_value.sival_ptr = &timerid; if (timer_create(CLOCKID, &sev, &timerid) == \-1) err(EXIT_FAILURE, "timer_create"); \& printf("stopur\-id er %#jx\[rs]n", (uintmax_t) timerid); \& /* Start stopuret. */ \& freq_nanosecs = atoll(argv[2]); its.it_value.tv_sec = freq_nanosecs / 1000000000; its.it_value.tv_nsec = freq_nanosecs % 1000000000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; \& if (timer_settime(timerid, 0, &its, NULL) == \-1) err(EXIT_FAILURE, "timer_settime"); \& /* Sov i en priode; i perioden kan stopuret udløbe flere gange. */ \& printf("Sover i %d sekunder\[rs]n", atoi(argv[1])); sleep(atoi(argv[1])); \& /* Lås stopursignalet op, så at stopurspåmindelsen kan leveres. */ \& printf("Fjerner blokering for signal %d\[rs]n", SIG); if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == \-1) err(EXIT_FAILURE, "sigprocmask"); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "SE OGSÅ" .ad l .nh \fBclock_gettime\fP(2), \fBsetitimer\fP(2), \fBtimer_delete\fP(2), \fBtimer_getoverrun\fP(2), \fBtimer_settime\fP(2), \fBtimerfd_create\fP(2), \fBclock_getcpuclockid\fP(3), \fBpthread_getcpuclockid\fP(3), \fBpthreads\fP(7), \fBsigevent\fP(3type), \fBsignal\fP(7), \fBtime\fP(7) .PP .SH OVERSÆTTELSE Oversættere af denne manual til dansk Joe Hansen . .PP Denne oversættelse er gratis dokumentation; læs .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE eller nyere for ophavsretbetingelser. Der er INGEN ANSVAR. .PP Hvis du støder på fejl i oversættelsen af ​​denne vejledning, skal du sende en besked til .MT debian-l10n-danish@lists.debian.org .ME .