16.1.3. ΠΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΡ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ; utmp ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, a wtmp ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΏΠΈΡΡΡ Π²ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΉ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°. ΠΠΎΠΌΠ°Π½Π΄Π° who ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ utmp Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° last β Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ wtmp Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ wtmp. Π ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Linux Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ utmp Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ /var/run/utmp, Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ wtmp β Π² ΡΠ°ΠΉΠ»Π΅ /var/log/wtmp.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ tty Π΄Π»Ρ ΡΠ΅Π°Π½ΡΠΎΠ² ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π°ΡΡΠΎΡΠΈΠΈΡΡΡΡΡΡ Π»ΠΈ ΠΎΠ½ΠΈ Ρ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠ΅ΠΉ), Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΡΠΈ Π΄Π²Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²Π½ΠΎ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΈΠ½ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ; Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π½Π΅ Ρ ΠΎΡΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅Π°Π½Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΉ ΠΈΠΌΠΈ Π² ΡΠΌΡΠ»ΡΡΠΎΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ X Window, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ»ΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠ΅ΡΡ Π²Ρ ΠΎΠ΄Π°. ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠ΅ ΡΠ΅Π°Π½ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ utmp ΠΈ wtmp Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. ΠΡΠ±ΡΠ΅ tty, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΠΈΠΌΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°ΠΌΠΈ, ΠΎΠ±ΡΡΠ½ΠΎ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ utmp ΠΈ wtmp Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ.
16.1.4. ΠΠ°ΠΏΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ utempter
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ pty, ΠΈΠΌΠ΅ΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΠΉ Π΄Π»Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² Π±Π°Π· Π΄Π°Π½Π½ΡΡ . ΠΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΠΏΡΠΈΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠΈΡΡΠ΅ΠΌ Linux ΠΈ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π½ΠΎ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ β ΡΡΠΈΠ»ΠΈΡΡ utempter. Π£ΡΠΈΠ»ΠΈΡΠ° utempter ΡΠ²Π»ΡΠ΅ΡΡΡ setgid (ΠΈΠ»ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, setuid) Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΡΠΌΠΈ Π΄Π»Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π±Π°Π· Π΄Π°Π½Π½ΡΡ utmp ΠΈ wtmp. ΠΠΎΡΡΡΠΏ ΠΊ Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ. Π£ΡΠΈΠ»ΠΈΡΠ° utempter ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π²Π»Π°Π΄Π΅Π΅Ρ Π»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ tty, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΡΠ°Π΅ΡΡΡ Π²ΠΎΠΉΡΠΈ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ utmp Π΄ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, utempter ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ pty; Π΄ΡΡΠ³ΠΈΠ΅ tty ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡΡΡ Π΄Π΅ΠΌΠΎΠ½Π°ΠΌΠΈ Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΡΠΌΠΈ Π΄Π»Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ .
#include <utempter.h>
void addToUtmp(const char *pty, const char *hostname, int ptyfd);
void removeLineFromUtmp(const char *pty, int ptyfd);
void removeFromUtmp(void);
Π€ΡΠ½ΠΊΡΠΈΡ addToUtmp() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°. ΠΠ΅ΡΠ²ΡΠΉ, pty, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π½ΡΠΌ ΠΏΡΡΠ΅ΠΌ ΠΊ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌΠΎΠΌΡ pty. ΠΡΠΎΡΠΎΠΉ, hostname, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ NULL ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π²ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ pty (ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ut_host, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π³Π»Π°Π²Ρ). Π’ΡΠ΅ΡΠΈΠΉ, ptyfd, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ, ΡΡΡΠ»Π°ΡΡΠΈΠΌΡΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, Π½Π°Π·Π²Π°Π½Π½ΠΎΠ΅ Π² Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅ pty.
Π€ΡΠ½ΠΊΡΠΈΡ removeLineFromUtmp() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°; ΠΎΠ½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΊΠ°ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ addToUtmp().
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΡΡΠ»ΠΎΠΆΠ½ΡΡΡΠ΅ΠΉ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄Π»Ρ ΠΎΡΠΈΡΡΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° utmp. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° utempter ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ addToUtmp(), ΠΈ ΡΠ΄ΠΎΠ±Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ removeFromUtmp(), Π½Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π΄Π΅ΠΉΡΡΠ²ΡΡΡΡΡ ΠΊΠ°ΠΊ removeLineFromUtmp() Π½Π° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΠΈΡ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ utmp; Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ pty, Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ removeLineFromUtmp().
16.1.5. ΠΠ°ΠΏΠΈΡΡ Π²ΡΡΡΠ½ΡΡ
ΠΠ±Π»Π°ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ utmp ΠΈ wtmp ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ΅Ρ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ²ΡΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ, Π³Π΄Π΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π»Π΅Ρ; Π΄Π°ΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π² utmp ΠΈ wtmp, Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ°Π΅ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ utmp ΠΈ wtmp Π±ΡΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ ΡΡΡΡΠΊΡΡΡ, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π½Π° Π΄ΠΈΡΠΊ; ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π±ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (API) Π΄Π»Ρ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΉ.
ΠΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π΄Π²Π° ΡΠ°ΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π±ΡΠ»ΠΈ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Ρ; ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ utmp (ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π² XSI, XPG2 ΠΈ SVID2) ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ utmpx (ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π² XPG4.2 ΠΈ Π² ΠΏΠΎΠ·Π΄Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΡ POSIX). Π Linux Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΎΠ±Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (utmp ΠΈ utmpx). ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ utmp, ΡΠΈΡΠΎΠΊΠΎ Π²Π°ΡΡΠΈΡΡΡΡΠΈΠΉΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠ°ΡΠΈΠ½Π°ΠΌΠΈ, ΠΈΠΌΠ΅Π΅Ρ Π½Π°Π±ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅Π»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΡΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ glibc. ΠΠΎΠ»Π΅Π΅ ΡΡΡΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ utmpx Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, Π½ΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Linux utmp Π±ΡΠ» ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π·Π°Π΄ΡΠΌΠ°Π½ ΠΊΠ°ΠΊ ΡΡΠΏΠ΅ΡΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² utmp, a utmpx Π±ΡΠ» ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ ΡΡΠΏΠ΅ΡΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² utmp; ΠΊ ΡΡΠ°ΡΡΡΡ, ΠΎΠ±Π° Π½Π°Π±ΠΎΡΠ° Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ. Π Linux ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ utmp ΠΈ utmpx Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π»ΠΈΡΡ Π² Π±ΡΠΊΠ²Π΅ x.
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ utmpx, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ, ΠΏΠΎΠΊΠ° Π²Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΈ ΡΡΡΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½.
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ utmp, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ glibc ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠΌΠ΅ΡΠ°Π½Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ β Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΠ±Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ glibc Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° utmp, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π»ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ utmpx. ΠΡΠΎΠ³ΠΎ ΠΌΡ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΡΡΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ utmp.h ΠΈ utmpx.h Π½Π΅ Π±ΡΠ΄ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²Π°ΡΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ, Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΠΈΠΌΠΈΡΡ ΠΊ Linux. ΠΡΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΡΠΈΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ΄Ρ Π΄Π²Π°ΠΆΠ΄Ρ β ΠΏΠ΅ΡΠ²ΡΡ Π²Π΅ΡΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ utmpx Π΄Π»Ρ Π»Π΅Π³ΠΊΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π² Π½ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, Π° Π²ΡΠΎΡΡΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ #ifdef β Π΄Π»Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π² ΠΊΠΎΡΠΎΡΡΡ Π²Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΠ΅ΡΡ.
ΠΠ΄Π΅ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΡΡΡΡ Π»ΠΈΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ; Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ glibc ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΠΈ utmp ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ struct utmp; ΠΌΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ. Π‘ΡΡΡΠΊΡΡΡΠ° ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ utmpx ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΡΡΡΡΠΊΡΡΡΠ° ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ utmp, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌ ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΡΡΡΡΠΊΡΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΄Π»Ρ utmp, ΠΈ Π΄Π»Ρ wtmp, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±Π΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠΈ.
struct utmp {
short int ut_type; /* ΡΠΈΠΏ Π²Ρ ΠΎΠ΄Π° */
pid_t ut_pid; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π²Ρ ΠΎΠ΄Π° */
char ut_line[UT_LINESIZE]; /* 32 ΡΠΈΠΌΠ²ΠΎΠ»Π° */
char ut_id[4]; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ inittab */
char ut_user[UT_NAMESIZE]; /* 32 ΡΠΈΠΌΠ²ΠΎΠ»Π° */
char ut_host[UT_HOSTSIZE]; /* 256 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² */
struct timeval ut_tv;
struct exit_status ut_exit; /* ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±Π΅Π·Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° */
long ut_session;
int32_t ut_addr_v6[4];
};
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ struct utmpx ΠΏΠΎΠ΄ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π±ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ struct utmpx, ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ "Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ POSIX" (Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ struct utmp, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΌΠ° struct utmp Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π°).
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π»ΡΡΡΡΡ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΌΠΈΡΡ NULL. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ sizeof() Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² Π±Π»Π°Π³ΠΎΡΠ°Π·ΡΠΌΠ½ΠΎ.
ut_type ΠΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ: EMPTY, INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, DEAD_PROCESS, BOOT_TIME, NEW_TIME, OLD_TIME, RUN_LVL ΠΈΠ»ΠΈ ACCOUNTING, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π½ΠΈΠΆΠ΅. ut_tv ΠΡΠ΅ΠΌΡ, Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ΠΌ. ΠΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΡΠΎΠΌΠ΅ ut_type, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠΉ POSIX ΠΊΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ Π΄Π»Ρ Π½Π΅ΠΏΡΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π΅ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ut_time, ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΠΌΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ . ut_pid ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ², Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΡ ΡΡ Π½Π° _PROCESS. ut_id ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ inittab Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ², Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΡ ΡΡ Π½Π° _PROCESS. ΠΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² Π½Π΅Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊΠ°Ρ ΡΠ°ΠΉΠ»Π° /etc/inittab, Π³Π΄Π΅ ΠΏΠΎΠ»Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ :. Π‘Π΅ΡΠ΅Π²ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ, Π½Π΅ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Ρ inittab, ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ; Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠ³ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ°ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΡΡΡΡΠΎΠΉΡΡΠ²Π΅.4 ut_line Π‘ΡΡΠΎΠΊΠ° (Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈΠ»ΠΈ Π½ΠΎΠΌΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΈΡΠΏΠ»Π΅Ρ Π΄Π»Ρ X), Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ POSIX ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ut_line Π½Π΅ ΡΡΠ½Π°; ΠΎΠ½Π° Π½Π΅ ΡΡΠΈΡΠ°Π΅Ρ ut_line Π·Π½Π°ΡΠ°ΡΠ΅ΠΉ Π΄Π»Ρ LOGIN_PROCESS, Π½ΠΎ Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ ΠΎΠ½Π° Π·Π½Π°ΡΠ°ΡΠ°Ρ Π΄Π»Ρ LOGIN_PROCESS, ΠΈ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅ΡΡΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅. POSIX ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ ut_line Π·Π½Π°ΡΠ°ΡΠ°Ρ Π΄Π»Ρ USER_PROCESS. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΎ Π·Π½Π°ΡΠ°ΡΠ°Ρ Π΄Π»Ρ DEAD_PROCESS, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π±Π΅Π·Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ut_user ΠΠ±ΡΡΠ½ΠΎ ΡΡΠΎ ΠΈΠΌΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ; ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠΌΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° (ΠΎΠ±ΡΡΠ½ΠΎ LOGIN) Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ut_type. ut_host ΠΠΌΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ°, Π²ΠΎΡΠ΅Π΄ΡΠ΅Π³ΠΎ Π² ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. ΠΠ»Π΅ΠΌΠ΅Π½Ρ ut_host ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ USER_PROCESS. ΠΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½ POSIX. ut_exit ut_exit.e_exit Π΄Π°Π΅Ρ ΠΊΠΎΠ΄ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠΌ WEXITSTATUS(), a ut_exit.e_termination Π΄Π°Π΅Ρ ΡΠΈΠ³Π½Π°Π», Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° (Π΅ΡΠ»ΠΈ ΠΎΠ½ Π±ΡΠ» Π·Π°Π²Π΅ΡΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ), ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠΌ WTERMSIG(). ΠΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½ POSIX. ut_session ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ΅Π°Π½ΡΠ° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ X Window. ΠΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½ POSIX. ut_addr_v6 IP-Π°Π΄ΡΠ΅Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ° Π² ΡΠ»ΡΡΠ°Π΅ Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ USER_PROCESS ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ inet_ntop() Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²Π°Ρ Π³ΡΡΠΏΠΏΠ° Π½Π΅ ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ, ΡΠΎΠ³Π΄Π° ΡΡΠΎ Π°Π΄ΡΠ΅Ρ IPV4 (inet_ntop() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ AF_INET); Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π°Π΄ΡΠ΅Ρ IPV6 (inet_ntop() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ AF_INET6). ΠΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½ POSIX.ΠΠ»Π΅ΠΌΠ΅Π½Ρ ut_type ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ut_type Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ; ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΡΡΡΡ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ.