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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 106

Автор Уильям БтивСнс

23 ΠœΡ‹ присваиваСм глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ daemon_proc Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚Π° внСшняя пСрСмСнная задаСтся нашими функциями err_XXX (см. Ρ€Π°Π·Π΄Π΅Π» Π“.4), ΠΈ Π΅Π΅ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сообщаСт этим функциям, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ syslog вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fprintf (которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…). Π­Ρ‚ΠΎ спасаСт нас ΠΎΡ‚ нСобходимости ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· вСсь наш ΠΊΠΎΠ΄ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ошибок, Ссли сСрвСр Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ провСряСм сСрвСр), Π° ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½Π° Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π½Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ syslog.

ИзмСнСниС Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ сброс всСх Π±ΠΈΡ‚ΠΎΠ² Π² маскС Ρ€Π΅ΠΆΠΈΠΌΠ° создания Ρ„Π°ΠΉΠ»Π°

24 ΠœΡ‹ измСняСм Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, хотя Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π΅ΠΌΠΎΠ½ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. НапримСр, Π΄Π΅ΠΌΠΎΠ½ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ накапливаСтся содСрТимоС Π·Π°Π΄Π°Π½ΠΈΠΉ для ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π° ΠΈ происходит вся Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ. Если Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ сбрасываСтся Π΄Π°ΠΌΠΏ (Ρ„Π°ΠΉΠ» core), ΠΎΠ½ появляСтся Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для измСнСния Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΌΠΎΠ½ ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π² любой Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΈ Ссли ΠΎΠ½ Ρ‚Π°ΠΌ останСтся, эту систСму нСльзя Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π²ΠΎ всяком случаС, Π±Π΅Π· ТСстких ΠΌΠ΅Ρ€.

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ всСх ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… дСскрипторов

25-27 ΠœΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ всС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ дСскрипторы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ процСсса, Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π΄Π΅ΠΌΠΎΠ½ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ этим процСссом Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄). ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состоит Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ наибольшСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ дСскриптора: Π² Unix Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π•ΡΡ‚ΡŒ способы опрСдСлСния максимального числа дСскрипторов, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ процСсс, Π½ΠΎ Π΄Π°ΠΆΠ΅ это достаточно слоТно [110, с. 43], ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€Π΅Π΄Π΅Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ бСсконСчным. НашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 64 дСскриптора, Π΄Π°ΠΆΠ΅ Ссли Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ…, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Solaris прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ closefrom, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ Π΄Π΅ΠΌΠΎΠ½Π°ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ stdin, stdout ΠΈ stderr Π² /dev/null

29-31 ΠΠ΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ /dev/null для чтСния ΠΈ записи ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΊ Π½Π΅ΠΌΡƒ дСскрипторы стандартных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π°, Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ дСскрипторы ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΈ опСрация чтСния ΠΈΠ· любого ΠΈΠ· Π½ΠΈΡ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 (ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°), Π° ядро ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ всС, Ρ‡Ρ‚ΠΎ записано Π² любой ΠΈΠ· этих Ρ‚Ρ€Π΅Ρ… дСскрипторов. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ эти дСскрипторы, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ любая библиотСчная функция, вызываСмая Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰Π°Ρ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°, Π»ΠΈΠ±ΠΎ Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ с ошибкой. ΠžΡ‚ΠΊΠ°Π· Π±Ρ‹Π» Π±Ρ‹ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасСн: Ссли Π΄Π΅ΠΌΠΎΠ½ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ сокСт для связи с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, дСскриптор сокСта воспринимаСтся ΠΊΠ°ΠΊ стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°, поэтому ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° perror ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ИспользованиС Π΄Π΅ΠΌΠΎΠ½Π° syslogd для Π²Ρ‹Π²ΠΎΠ΄Π° сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

32 Π’ызываСтся функция openlog. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ бСрСтся ΠΈΠ· Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, argv[0]). ΠœΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ. АргумСнт facility Ρ‚Π°ΠΊΠΆΠ΅ задаСтся Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ процСссом, ΠΈ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константа ΠΈΠ· Ρ‚Π°Π±Π». 13.2 Π»ΠΈΠ±ΠΎ, Ссли ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ LOG_USER, Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π΅ΠΌΠΎΠ½ выполняСтся Π±Π΅Π· ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сигнал SIGHUP ΠΎΡ‚ ядра. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π΅ΠΌΠΎΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ этот сигнал Π² качСствС увСдомлСния ΠΎΡ‚ администратора, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄Π΅ΠΌΠΎΠ½Π° измСнился ΠΈ Π΄Π΅ΠΌΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΅Ρ‰Π΅ Ρ€Π°Π· ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ». Π”Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… сигнала, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ, β€” это сигналы SIGINT ΠΈ SIGWINCH, ΠΈ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для увСдомлСния Π΄Π΅ΠΌΠΎΠ½Π° ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… измСнСниях.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: сСрвСр Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹ Π² качСствС Π΄Π΅ΠΌΠΎΠ½Π°

Π’ листингС 13.2 прСдставлСно ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ нашСго сСрвСра Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹, Π½Π΅ зависящСго ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ сСрвСра, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² листингС 11.8, Π² Π½Π΅ΠΌ вызываСтся функция daemon_init, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот сСрвСр ΠΌΠΎΠ³ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² качСствС Π΄Π΅ΠΌΠΎΠ½Π°.

Листинг 13.2. НС зависящий ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° сСрвСр Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² качСствС Π΄Π΅ΠΌΠΎΠ½Π°

//inetd/daytimetcpsrv2.c

 1 #include "unp.h"

 2 #include <time.h>


 3 int

 4 main(int argc, char **argv)

 5 {

 6  int listenfd, connfd;

 7  socklen_t addrlen, len;

 8  struct sockaddr *cliaddr;

 9  char buff[MAXLINE];

10  time_t ticks;


11  daemon_init(argv[0], 0);


12  if (argc == 2)

13   listenfd = Tcp_listen(NULL, argv[1], &addrlen);

14  else if (argc == 3)

15   listenfd = Tcp_listen(argv[1], argv[2], &addrlen);

16  else

17   err_quit("usage: daytimetcpsrv2 [ <host> ] <service or port>");


18  cliaddr = Malloc(addrlen);


19  for (;;) {

20   len = addrlen;

21   connfd = Accept(listenfd, cliaddr, &len);

22   err_msg("connection from %s", Sock_ntop(cliaddr, len));


23   ticks = time(NULL);

24   snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

25   Write(connfd, buff, strlen(buff));


26   Close(connfd);

27  }

28 }

ИзмСнСний всСго Π΄Π²Π°: ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ daemon_init, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запускаСтся, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ err_msg вмСсто printf, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вывСсти IP-адрСс ΠΈ ΠΏΠΎΡ€Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. На самом Π΄Π΅Π»Π΅, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½Ρ‹, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ printf ΠΈ fprintf ΠΈ вмСсто Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ err_msg.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ провСряСм argc ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° daemon_init. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠΈΠΉ Π΄Π΅ΠΌΠΎΠ½Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ нСдопустимом количСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ПослС Π²Ρ‹Π·ΠΎΠ²Π° daemon_init всС сообщСния Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² систСмный ΠΆΡƒΡ€Π½Π°Π».

Если ΠΌΡ‹ запустим эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° нашСм ΡƒΠ·Π»Π΅ linux ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ„Π°ΠΉΠ» /var/log/messages (ΠΊΡƒΠ΄Π° ΠΌΡ‹ отправляСм всС сообщСния LOG_USER) послС соСдинСния с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΡƒΠ·Π»ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

Jul 10 09:54:37 linux daytimetcpsrv2[24288]: connection from 127.0.0.1.55862

Π”Π°Ρ‚Π°, врСмя ΠΈ имя ΡƒΠ·Π»Π° автоматичСски ставятся Π² Π½Π°Ρ‡Π°Π»Π΅ сообщСния Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ syslogd.

13.5. Π”Π΅ΠΌΠΎΠ½ inetd

Π’ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ систСмС Unix ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ сСрвСров, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ FTP, Telnet, Rlogin, TFTP ΠΈ Ρ‚.Π΄. Π’ систСмах, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… 4.3BSD, каТдая ΠΈΠ· этих слуТб ΠΈΠΌΠ΅Π»Π° связанный с Π½Π΅ΠΉ процСсс. Π­Ρ‚ΠΎΡ‚ процСсс запускался Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /etc/rc, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс выполнял практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ запуска: созданиС сокСта, связываниС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind Π·Π°Ρ€Π°Π½Π΅Π΅ извСстного ΠΏΠΎΡ€Ρ‚Π° с сокСтом, ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ соСдинСния (TCP) ΠΈΠ»ΠΈ получСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ (UDP) ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork. Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс выполнял обслуТиваниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΆΠ΄Π°Π», ΠΊΠΎΠ³Π΄Π° поступит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π­Ρ‚Π° модСль характСризуСтся двумя нСдостатками.

1. Π’сС Π΄Π΅ΠΌΠΎΠ½Ρ‹ содСрТали практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ запуска, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ сначала Π½Π° созданиС сокСта, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π° ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ процСсса Π² процСсс Π΄Π΅ΠΌΠΎΠ½Π° (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ daemon_init).

2. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄Π΅ΠΌΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ мСсто Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов, Π½ΠΎ ΠΏΡ€ΠΈ этом Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ находился Π² состоянии оТидания.

РСализация 4.3BSD упростила ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, прСдоставив супСрсСрвСр (superserver) Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° β€” Π΄Π΅ΠΌΠΎΠ½ inetd. Π­Ρ‚ΠΎΡ‚ Π΄Π΅ΠΌΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ сСрвСрами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ TCP ΠΈΠ»ΠΈ UDP, ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ сокСты Unix. Π”Π΅ΠΌΠΎΠ½ inetd Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π΄Π²Π΅ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

1. ΠžΠ½ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ написаниС процСссов Π΄Π΅ΠΌΠΎΠ½ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ подробностСй запуска. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ устраняСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ daemon_init для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСрвСра.

2. Π­Ρ‚ΠΎΡ‚ Π΄Π΅ΠΌΠΎΠ½ позволяСт ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌΡƒ процСссу (inetd) ΠΆΠ΄Π°Ρ‚ΡŒ входящиС клиСнтскиС запросы ΠΊΠΎ мноТСству слуТб (вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ слуТбы). Π­Ρ‚ΠΎ сокращаСт ΠΎΠ±Ρ‰Π΅Π΅ число процСссов Π² систСмС.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ inetd сам становится Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΠ·Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΏΡ€ΠΈ описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ daemon_init. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ считываСт ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ„Π°ΠΉΠ» /etc/inetd.conf. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Π·Π°Π΄Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ слуТбы Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ супСрсСрвСр, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ запрос ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих слуТб. КаТдая строка содСрТит поля, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π». 13.4. Π’ΠΎΡ‚ нСсколько строк Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°: