NAVN
- Provided by: manpages-da-dev (Version: 4.31.0-1)
- Source: manpages-l10n
- Report a bug
Realtidsbibliotek (librt, -lrt)
#include <signal.h> /* Definition af SIGEV_*-konstanter */ #include <time.h>
int timer_create(clockid_t clockid,
struct sigevent *_Nullable restrict sevp,
timer_t *restrict timerid);
timer_create():
_POSIX_C_SOURCE >= 199309L
timer_create() opretter et nyt per proces-intervalstopur. Id'et for det nye stopur returneres i mellemlageret der peger på timerid, der skal være en ikke-null peger. Dette id er unik i processen, indtil stopuret slettes. Det nye stopur er oprindelig afvæbnet.
Argumentet clockid angiver uret, som det nye stopur bruger til at måle tiden. Kan angives som en af de følgende værdier:
Se clock_getres(2) for yderligere detaljer om ovenstående ure.
Udover de ovenstående værdier kan clockid angives som clockid returneret af et kald til clock_getcpuclockid(3) eller pthread_getcpuclockid(3).
Argumentet sevp peget på en sigevent-struktur, der angiver hvordan kalderen skal blive påmindet når stopuret udløber. For defintionen og generelle detaljer for denne struktur, se sigevent(3type).
Feltet sevp.sigev_notify kan have de følgende værdier:
Angivelse af sevp som NULL svarer til at angive en peger til en sigevent-struktur hvori sigev_notify er SIGEV_SIGNAL, sigev_signo er SIGALRM og sigev_value.sival_int er stopur-id'et.
Ved succes, timer_create() returnerer 0 og id'et for det nye stopur er placeret i *timerid. Ved fejl, -1 returneres og errno angives for at indikere fejlen.
Dele af implementeringen af POSIX-stopurs-API'en tilbydes af glibc. Specielt:
POSIX.1-2024.
Linux 2.6. POSIX.1-2001.
Før Linux 2.6 tilbød glibc en ufuldstændig brugerrumsimplementering (kun CLOCK_REALTIME-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.
Et program kan oprette flere intervalstopure via timer_create().
Stopure arves ikke af underprocessen for en fork(2), og afvæbnes og slettes under en execve(2).
Kernen præallokerer et »køet realtids signal« for hvert stopur oprettet via timer_create(). Som konsekvens er antallet af stopure begrænset af ressourcebegrænsningen RLIMIT_SIGPENDING (se setrlimit(2)).
Stopurene oprettet af timer_create() kendes ofte som »POSIX-(interval)stopure. POSIX-stopurs-API'en består af de følgende grænseflader:
Siden Linux 3.10 kan filen /proc/pid/timers bruges til at vise POSIX-stoprurene for processen med PID pid. Se proc(5) for yderligere information.
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 CONFIG_POSIX_TIMERS.
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.
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.
$ ./a.out 1 100;
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
#include <err.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#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\n", (uintmax_t) *tidp);
or = timer_getoverrun(*tidp);
if (or == -1)
err(EXIT_FAILURE, "timer_getoverrun");
printf(" overrun count = %d\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\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 <sleep-secs> <freq-nanosecs>\n",
argv[0]);
exit(EXIT_FAILURE);
}
/* Etabler håndtering for stopurssignal. */
printf("Etablerer håndtering for signal %d\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\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\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\n", atoi(argv[1]));
sleep(atoi(argv[1]));
/* Lås stopursignalet op, så at stopurspåmindelsen
kan leveres. */
printf("Fjerner blokering for signal %d\n", SIG);
if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
err(EXIT_FAILURE, "sigprocmask");
exit(EXIT_SUCCESS);
}
clock_gettime(2), setitimer(2), timer_delete(2), timer_getoverrun(2), timer_settime(2), timerfd_create(2), clock_getcpuclockid(3), pthread_getcpuclockid(3), pthreads(7), sigevent(3type), signal(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.