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

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

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

3. ΠšΠΎΠ³Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс увСдомляСтся ΠΎΠ± этом с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сигнала SIGCHLD, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса. Он снова Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сокСта, устанавливая Π±ΠΈΡ‚ для этого сокСта Π² своСм Π½Π°Π±ΠΎΡ€Π΅ дСскрипторов.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π»Π°Π΄Π΅Π²Π°Ρ‚ΡŒ сокСтом, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, лишая Ρ‚Π΅ΠΌ самым Π΄Π΅ΠΌΠΎΠ½ inetd возмоТности Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select Π½Π° этом сокСтС для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ готовности Π΅Π³ΠΎ для чтСния (Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°), Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для сСрвСра Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ сокСт, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ сСрвСра TCP, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ имССтся ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ присоСдинСнному сокСту для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если Π΄Π΅ΠΌΠΎΠ½ inetd Π½Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ» Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π½Π° сокСтС Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ ΠΈ, допустим, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс (inetd) Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ, Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° всС Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅ сокСта. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ функция select снова сообщаСт, Ρ‡Ρ‚ΠΎ сокСт Π³ΠΎΡ‚ΠΎΠ² для чтСния, ΠΈ Π΄Π΅ΠΌΠΎΠ½ inetd снова выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fork, пороТдая Π΄Ρ€ΡƒΠ³ΠΎΠΉ (Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ) Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс. Π”Π΅ΠΌΠΎΠ½ inetd Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ сокСт Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π» Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° сокСта. Π”Π΅ΠΌΠΎΠ½ inetd ΡƒΠ·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» Ρ€Π°Π±ΠΎΡ‚Ρƒ с сокСтом, ΠΏΡƒΡ‚Π΅ΠΌ получСния сигнала SIGCHLD, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 22.7.

ΠŸΡΡ‚ΡŒ стандартных слуТб Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°, описанных Π² Ρ‚Π°Π±Π». 2.1, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ самим Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd (см. ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.2).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept для сСрвСра TCP Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π΅ΠΌΠΎΠ½ inetd (Π° Π½Π΅ сам сСрвСр), Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, запускаСмый Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getpeername для получСния IP-адрСса ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ВспомнитС рис. 4.9, Π³Π΄Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ послС выполнСния Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² fork ΠΈ exec (Ρ‡Ρ‚ΠΎ выполняСт Π΄Π΅ΠΌΠΎΠ½ inetd) Ρƒ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра Π΅ΡΡ‚ΡŒ СдинствСнный способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getpeername.

Π”Π΅ΠΌΠΎΠ½ inetd ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для сСрвСров, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с большими объСмами Π΄Π°Π½Π½Ρ‹Ρ…, Π² особСнности ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΌΠΈ сСрвСрами ΠΈ Π²Π΅Π±-сСрвСрами. НапримСр, функция sendmail ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ запускаСтся ΠΊΠ°ΠΊ стандартный ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.8. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ пороТдСния процСсса для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ клиСнтского соСдинСния Ρ€Π°Π²Π½Π° стоимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² случаС сСрвСра TCP, Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd, β€” стоимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ fork ΠΈ exec. Π’Π΅Π±-сСрвСры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ мноТСство Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов ΠΏΡ€ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ процСссов для обслуТивания ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π² Π³Π»Π°Π²Π΅ 30.

13.6. Ѐункция daemon_inetd

Π’ листингС 13.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° функция daemon_inetd, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ с сСрвСра, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd.

Листинг 13.3. Ѐункция daemon_inetd для придания свойств Π΄Π΅ΠΌΠΎΠ½Π° процСссу, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd

//daemon_inetd.c

1 #include "unp.h"

2 #include <syslog.h>


3 extern int daemon_proc; /* ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² error.c */


4 void

5 daemon_inetd(const char *pname, int facility)

6 {

7  daemon_proc = 1; /* для Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ err_XXX() */

8  openlog(pname, LOG_PID, facility);

9 }

Π­Ρ‚Π° функция Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π° ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с daemon_init, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС шаги Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd ΠΏΡ€ΠΈ запускС. ВсС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ, β€” устанавливаСм Ρ„Π»Π°Π³ daemon_proc для Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ошибок (см. Ρ‚Π°Π±Π». Π“.1) ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ openlog с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ daemon_init, прСдставлСнной Π² листингС 13.1.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: сСрвСр Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹, Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd

Листинг 13.4 прСдставляСт собой ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ нашСго сСрвСра Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² листингС 13.2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd.

Листинг 13.4. НС зависящий ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° сСрвСр Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd

//inetd/daytimetcpsrv3.c

 1 #include "unp.h"

 2 #include <time.h>


 3 int

 4 main(int argc, char **argv)

 5 {

 6  socklen_t len;

 7  struct sockaddr *cliaddr;

 8  char buff[MAXLINE];

 9  time_t ticks;


10  daemon_inetd(argv[0], 0);


11  cliaddr = Malloc(MAXSOCKADDR);

12  len = MAXSOCKADDR;

13  Getpeername(0, cliaddr, &len);

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


15  ticks = time(NULL);

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

17  Write(0, buff, strlen(buff));


18  Close(0); /* Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС TCP */

19  exit(0);

20 }

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сдСлано Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… измСнСния. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, исчСз вСсь ΠΊΠΎΠ΄ создания сокСта: Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ tcp_listen ΠΈ accept. Π­Ρ‚ΠΈ шаги Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd, ΠΈ ΠΌΡ‹ ссылаСмся Π½Π° соСдинСниС TCP, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ дСскриптор (стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π°). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, исчСз бСсконСчный Ρ†ΠΈΠΊΠ» for, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСрвСр активизируСтся ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ€Π°Π·Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ клиСнтского соСдинСния. ПослС прСдоставлСния сСрвиса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ сСрвСр Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getpeername

11-14 ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tcp_listen, ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° структуры адрСса сокСта, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, Π° ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept, Ρ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΈ адрСса ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ выдСляСм Π±ΡƒΡ„Π΅Ρ€ для структуры адрСса сокСта, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°ΡˆΡƒ константу MAXSOCKADDR ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getpeername с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ дСскриптором Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² нашСй систСмС Solaris, сначала ΠΌΡ‹ присваиваСм слуТбС имя ΠΈ ΠΏΠΎΡ€Ρ‚, добавляя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Π² /etc/services:

mydaytime 9999/tcp

Π—Π°Ρ‚Π΅ΠΌ добавляСм строку Π² /etc/inetd.conf:

mydaytime stream tcp nowait andy

/home/andy/daytimetcpsrv3 daytimetcpsrv3

(ΠœΡ‹ Ρ€Π°Π·Π±ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅.) ΠœΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ выполняСмый ΠΊΠΎΠ΄ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ отправляСм Π΄Π΅ΠΌΠΎΠ½Ρƒ inetd сигнал SIGHUP, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ netstat, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ€Ρ‚Π΅ TCP 9999 создан ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ сокСт:

solaris % netstat -na | grep 9999

*.9999 *.* 0 0 49152 0 LISTEN

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ запускаСм сСрвСр с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°:

linux % telnet solaris 9999

Trying 192.168.1.20...

Connected to solaris.

Escape character is '^]'.

Tue Jun 10 11:04:02 2003

Connection closed by foreign host.

Π€Π°ΠΉΠ» /var/amd/messages (Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² нашСм Ρ„Π°ΠΉΠ»Π΅ /etc/syslog.conf, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ наши сообщСния с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ facility=LOG_USER) содСрТит запись:

Jun 10 11:04:02 solaris daytimetcpsrv3[28724]: connection from 192.168.1.10.58145

13.7. РСзюмС

Π”Π΅ΠΌΠΎΠ½Ρ‹ β€” это процСссы, выполняСмыС Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ нСзависимо ΠΎΡ‚ управлСния с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ². МногиС сСтСвыС сСрвСры Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½Ρ‹. ВсС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΌΠΎΠ½Ρƒ syslogd ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ syslog. Администратор ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ всС, Ρ‡Ρ‚ΠΎ происходит с этими сообщСниями, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Π΄Π΅ΠΌΠΎΠ½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» Π΄Π°Π½Π½ΠΎΠ΅ сообщСниС ΠΈ насколько ΠΎΠ½ΠΎ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π΅ Π² качСствС Π΄Π΅ΠΌΠΎΠ½Π°, трСбуСтся ΠΏΡ€ΠΎΠΉΡ‚ΠΈ нСсколько шагов: Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fork для запуска Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setsid для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ сСанс POSIX ΠΈ ΡΡ‚Π°Ρ‚ΡŒ Π³Π»Π°Π²Π½Ρ‹ΠΌ процСссом сСанса, снова Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fork, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌ управлСния с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ маску Ρ€Π΅ΠΆΠΈΠΌΠ° создания Ρ„Π°ΠΉΠ»Π° ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ всС Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Наша функция daemon_init выполняСт всС эти шаги.

МногиС сСрвСры Unix Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd. Он осущСствляСт всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ шаги ΠΏΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ процСсса Π² Π΄Π΅ΠΌΠΎΠ½, ΠΈ ΠΏΡ€ΠΈ запускС Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра открываСтся сокСт для стандартных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π°, Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ socket, bind, listen ΠΈ accept, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС эти шаги Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd.

УпраТнСния

1. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² листингС 13.2, Ссли ΠΌΡ‹ ΠΎΡ‚Π»ΠΎΠΆΠΈΠΌ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ daemon_init Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ функция err_quit Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° станСт Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ?

2. ΠšΠ°ΠΊ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· 10 сСрвСров, пСрСчислСнных Π² Ρ‚Π°Π±Π». 2.1 (ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ вСрсии TCP ΠΈ UDP для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· пяти слуТб, управляСмых Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd), Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

3. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ создадим сокСт UDP, свяТСм ΠΏΠΎΡ€Ρ‚ 7 с сокСтом (стандартный эхо-сСрвСр Π² Ρ‚Π°Π±Π». 2.1) ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ UDP-сСрвСру chargen?