Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 75

Автор Майкл ДТонсон

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 Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ для записи систСмной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ; ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для спСциализированных систСмных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ.