getitimer(2) System Calls Manual getitimer(2) BEZEICHNUNG getitimer, setitimer - Zeit eines Intervall-Timers abfragen oder setzen BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int getitimer(int welcher, struct itimerval *aktueller_wert); int setitimer(int welcher, const struct itimerval *restrict neuer_wert, struct itimerval *_Nullable restrict alter_wert); BESCHREIBUNG Diese Systemaufrufe ermoglichen den Zugriff auf Intervall-Timer, das sind Timer (Zeitgeber), die zuerst zu einem bestimmten Zeitpunkt in der Zukunft ablaufen und (optional) anschliessend nach regelmassigen Intervallen. Wenn ein Timer ablauft, wird ein Signal fur den aufrufenden Prozess erzeugt und der Timer wird auf das angegebene Intervall zuruckgesetzt (falls verschieden von Null). Es werden drei Arten von Timern - durch das Argument welcher spezifiziert - zur Verfugung gestellt, von denen jeder gegen eine andere Uhr lauft und ein anderes Signal bei Ablauf erzeugt: ITIMER_REAL Dieser Timer zahlt in Echtzeit (im Sinne der tatsachlich vergangenen Zeit, >>wall clock<<) herunter. Bei jedem Ablauf wird ein Signal SIGALRM erzeugt. ITIMER_VIRTUAL Dieser Timer zahlt gegen die Usermodus-Prozessorzeit herunter, die vom Prozess verbraucht wird. (Die Messung beinhaltet die Prozessorzeit, die von allen Threads im Prozess verbraucht wird.) Bei jedem Ablauf wird ein Signal SIGVTALRM erzeugt. ITIMER_PROF Dieser Timer zahlt gegen die Gesamt-Prozessorzeit (d.h. sowohl Usermodus als auch Systemmodus) herunter, die vom Prozess verbraucht wird. (Die Messung beinhaltet die Prozessorzeit, die von allen Threads im Prozess verbraucht wird.) Bei jedem Ablauf wird ein Signal SIGPROF erzeugt. In Verbindung mit ITIMER_VIRTUAL kann dieser Timer verwendet werden, um die Usermodus- und Systemmodus-Prozessorzeit zu messen, die vom Prozess verbraucht wird. Ein Prozess hat nur jeweils einen dieser drei Arten von Timern. Timerwerte sind durch folgende Strukturen definiert: struct itimerval { struct timeval it_interval; /* Intervall fur periodische Timer */ struct timeval it_value; /* Zeit bis zum nachsten Ablauf */ }; struct timeval { time_t tv_sec; /* Sekunden */ suseconds_t tv_usec; /* Mikrosekunden */ }; getitimer() Die Funktion getitimer() platziert den aktuellen Wert des Timers welcher in den Puffer, auf den aktueller_wert zeigt. Die Unterstruktur it_value wird mit der Restzeit gefullt, die noch verbleibt, bevor der angegebene Timer das nachste Mal ablauft. Dieser Wert verandert sich, wahrend der Timer herunterzahlt und wird auf it_interval zuruckgesetzt, wenn der Timer ablauft. Wenn beide Felder von it_value Null sind, dann ist dieser Timer gerade nicht scharfgeschaltet (inaktiv). Die Unterstruktur it_interval wird mit dem Timerintervall gefullt. Wenn beide Felder von it_interval Null sind, dann ist dies ein einmaliger Timer (d.h. er lauft nur einmal ab). setitimer() Die Funktion setitimer() aktiviert oder deaktiviert den durch welcher angegebenen Timer, indem der Timer auf den Wert gesetzt wird, der durch neuer_wert festgelegt wurde. Falls alter_wert nicht NULL ist, wird der Puffer, auf den gezeigt wird, zur Ruckgabe des vorherigen Wertes des Timers verwendet (also die gleiche Information, die von getitimer() zuruckgegeben wird). Wenn eines der Felder in neuer_wert.it_value nicht Null ist, dann ist dieser Timer scharfgeschaltet, um initial zur angegebenen Zeit abzulaufen. Wenn beide Felder in neuer_wert.it_value Null sind, ist dieser Timer nicht scharfgeschaltet. Das Feld neuer_wert.it_interval legt das neue Intervall fur den Timer fest; wenn beide Unterfelder Null sind, ist es ein einmaliger Timer. RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EFAULT neuer_wert, alter_wert oder aktueller_wert sind keine gultigen Zeiger. EINVAL welcher ist weder ITIMER_REAL, ITIMER_VIRTUAL noch ITIMER_PROF oder (seit Linux 2.6.22) eines der tv_usec-Felder in der Struktur, auf die neuer_wert zeigt, enthalt einen Wert, der ausserhalb des Bereichs [0, 999999] liegt. VERSIONEN Die Standards schweigen zu der Bedeutung des folgenden Aufrufs: setitimer(which, NULL, &alter_wert); Viele Systeme (Solaris, die BSDs und vielleicht andere) behandeln dies aquivalent zu Folgendem: getitimer(which, &alter_wert); Unter Linux wird dies als aquivalent zu einem Aufruf betrachtet, bei dem die Felder neuer_wert Null sind, das heisst, der Timer deaktiviert ist. Benutzen Sie nicht diese ungunstige Linux-Eigenschaft: Sie ist nicht portierbar und unnotig. STANDARDS POSIX.1-2008. GESCHICHTE POSIX.1-2001, SVr4, 4.4BSD (dieser Aufruf erschien erstmalig in 4.2BSD). POSIX.1-2008 kennzeichnet getitimer() und setitimer() als veraltet und empfiehlt stattdessen die POSIX-Timer-API zu benutzen (timer_gettime(2), timer_settime(2), etc.). ANMERKUNGEN Timer laufen nie vor der angeforderten Zeit ab, konnten aber eine (kurze) Zeit danach ablaufen. Dies hangt von der Timerauflosung des Systems und der Systemauslastung ab; siehe time(7). (Siehe aber im Folgenden den Abschnitt FEHLER.) Falls ein Timer ablauft, wahrend der Prozess aktiv ist (trifft fur ITIMER_VIRTUAL immer zu), wird das Signal sofort gesandt, wenn es generiert ist. Ein Kindprozess, der mittels fork(2) erzeugt wurde, erbt nicht die Intervall-Timer seines Elternprozesses. Intervall-Timer bleiben uber ein execve(2) erhalten. POSIX.1 beschreibt das Zusammenspiel zwischen setitimer() und den drei Schnittstellen alarm(2), sleep(3) und usleep(3) nicht naher. FEHLER Das Generieren und Senden eines Signals sind eigenstandig und nur eine Instanz von jedem der oben aufgelisteten Signale kann fur einen Prozess anstehen. Unter sehr hoher Systemlast kann ein ITIMER_REAL-Timer ablaufen, bevor das Signal von einem vorherigen Ablauf geliefert wurde. Das zweite Signal geht bei einem solchen Ereignis verloren. Vor Linux 2.6.16 wurden Timerwerte in Jiffies dargestellt. Falls eine Anfrage zum Setzen des Timers gemacht wurde, dessen Jiffies-Entsprechung MAX_SEC_IN_JIFFIES ubersteigt (in include/linux/jiffies.h definiert), dann wurde der Timer stillschweigend auf diese Obergrenze gekurzt. Auf Linux/i386 (wobei seit Linux 2.6.13 der Standard-Jiffy 0,004 Sekunden entspricht), bedeutet dies, dass die Obergrenze fur einen Timer zirka 99,42 Tagen entspricht. Seit Linux 2.6.16 benutzt der Kernel eine andere interne Entsprechung fur Zeiten und diese Obergrenze wurde entfernt. Auf bestimmten Systemen (einschliesslich i386) haben Linux-Kernel vor 2.6.12 einen Fehler, der unter Umstanden vorzeitige Timerablaufe von bis zu einem Jiffy produziert. Dieser Fehler wurde in Linux 2.6.12 behoben. Laut POSIX.1-2001 sollte setitimer() fehlschlagen, wenn ein tv_usec-Wert angegeben wurde, der ausserhalb des Bereichs [0, 999999] liegt. Unter Linux bis einschliesslich 2.6.21 gibt Linux jedoch keinen Fehler zuruck, sondern passt stattdessen stillschweigend den Sekundenwert fur den Timer an. Ab Linux 2.6.22 aufwarts wurde dieser Fehler behoben: Ein unpassender tv_usec-Wert fuhrt zu einem EINVAL-Fehler. SIEHE AUCH gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann , Chris Leick , Mario Blattermann und Dr. Tobias Quathamer erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 getitimer(2)