Π ΠΈΡ. 25.2. Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ±ΡΠ²Π°ΡΡΠΈΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ΠΈ ΡΡΡΡΠΊΡΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ² ΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ²
ΠΠ½Π΄Π΅ΠΊΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²13-15 ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ iget ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ iput β ΡΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ nqueue ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 25.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΊΠ» ΡΠ΅ΡΠ²Π΅ΡΠ° β ΡΡΠ½ΠΊΡΠΈΡ dg_echo.
ΠΠΈΡΡΠΈΠ½Π³ 25.2. Π€ΡΠ½ΠΊΡΠΈΡ dg_echo: ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΉ ΡΠΈΠΊΠ» ΡΠ΅ΡΠ²Π΅ΡΠ°
//sigio/dgecho01.c
19 void
20 dg_echo(int sockfd_arg, SA *pcliaddr, socklen_t clilen_arg)
21 {
22 int i;
23 const int on = 1;
24 sigset_t zeromask, newmask, oldmask;
25 sockfd = sockfd_arg;
26 clilen = clilen_arg;
27 for (i = 0; i < QSIZE; i++) { /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ */
28 dg[i].dg_data = Malloc(MAXDG);
29 dg[i].dg_sa = Malloc(clilen);
30 dg[i].dg_salen = clilen;
31 }
32 iget = iput = nqueue = 0;
33 Signal(SIGHUP, sig_hup);
34 Signal(SIGIO, sig_io);
35 Fcntl(sockfd, F_SETOWN, getpid());
36 Ioctl(sockfd, FIOASYNC, &on);
37 Ioctl(sockfd. FIONBIO, &on);
38 Sigemptyset(&zeromask); /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ΅Ρ Π½Π°Π±ΠΎΡΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ² */
39 Sigemptyset(&oldmask);
40 Sigemptyset(&newmask);
41 Sigaddset(&newmask, SIGIO); /* ΡΠΈΠ³Π½Π°Π», ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΠΈΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ*/
42 Sigprocmask(SIG_BLOCK, &newmask, &oldmask);
43 for (;;) {
44 while (nqueue == 0)
45 sigsuspend(&zeromask); /* ΠΆΠ΄Π΅ΠΌ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ */
46 /* ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO */
47 Sigprocmask(SIG_SETMASK, &oldmask, NULL);
48 Sendto(sockfd, dg[iget].dg_data, dg[iget].dg_len, 0,
49 dg[iget].dg_sa, dg[iget].dg_salen);
50 if (++iget >= QSIZE)
51 iget = 0;
52 /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° SIGIO */
53 Sigprocmask(SIG_BLOCK, &newmask, &oldmask);
54 nqueue--;
55 }
56 }
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΏΡΠΈΠ½ΡΡΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ27-32 ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΏΡΠΈΠ½ΡΡΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΈ ΡΠ»Π°Π³ΠΎΠ² ΡΠΎΠΊΠ΅ΡΠΎΠ²33-37 ΠΠ»Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² SIGHUP (ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅Π»Π΅ΠΉ) ΠΈ SIGIO ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fcntl Π·Π°Π΄Π°Π΅ΡΡΡ Π²Π»Π°Π΄Π΅Π»Π΅Ρ ΡΠΎΠΊΠ΅ΡΠ°, Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ioctl ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π°Π³ΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ, ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ Π°Π½Π΅Π΅ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ, ΡΡΠΎ Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ, Π² POSIX ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ»Π°Π³ O_ASYNC ΡΡΠ½ΠΊΡΠΈΠΈ fcntl, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ioctl. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ»Π°Π³ O_NONBLOCK Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π·Π΄Π΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ioctl.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π°Π±ΠΎΡΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ²38-41 ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΡΠΈ Π½Π°Π±ΠΎΡΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ²: zeromask (Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ), oldmask (Ρ ΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΡ ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»Π°, ΠΊΠΎΠ³Π΄Π° SIGIO Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ) ΠΈ newmask. Π€ΡΠ½ΠΊΡΠΈΡ sigaddset Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² Π½Π°Π±ΠΎΡ newmask Π±ΠΈΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ SIGIO.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ42-45 Π€ΡΠ½ΠΊΡΠΈΡ sigprocmask ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΡΡ ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² oldmask, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠ°Π²Π½ΠΈΠ²Π°Ρ newmask Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΌΠ°ΡΠΊΠΎΠΉ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². Π’Π°ΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡ ΡΠΈΠ³Π½Π°Π» SIGIO ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ΅ΠΊΡΡΡΡ ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ°Π»Π΅Π΅ ΠΌΡ Π·Π°Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠΈΠΊΠ» for ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊ nqueue. ΠΠΎΠΊΠ° ΡΡΠΎΡ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ, Π½ΠΈΡΠ΅Π³ΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΠΈ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sigsuspend. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ POSIX, ΡΠΎΡ ΡΠ°Π½ΠΈΠ² Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΠΊΡΡΡΡ ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΌΠ°ΡΠΊΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° zeromask. Π’Π°ΠΊ ΠΊΠ°ΠΊ zeromask ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΡΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π»ΡΠ±ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠΈΠ³Π½Π°Π» ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΡΠ½ΠΊΡΠΈΡ sigsuspend ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. (ΠΡΠΎ Π½Π΅ΠΎΠ±ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π° Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ EINTR.) ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ, ΡΡΠ½ΠΊΡΠΈΡ sigsuspend Π²ΡΠ΅Π³Π΄Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΎ Π΅Π΅ Π²ΡΠ·ΠΎΠ²Ρ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ newmask). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ, ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ sigsuspend Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΈΠ³Π½Π°Π» SIGIO Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½. ΠΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΡΠ΅ΡΡΠΈΠΊ nqueue, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΠΎΠΊΠ° ΠΎΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ, ΡΠΈΠ³Π½Π°Π» SIGIO Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΡΠΈΠ³Π½Π°Π» SIGIO Π½Π΅ Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ nqueue, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠ²? ΠΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡΡ ΡΠ°ΠΊ, ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° nqueue ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΠΈΠ³Π½Π°Π» ΠΈ nqueue ΡΡΠ°Π½Π΅Ρ ΡΠ°Π²Π½Π° 1. ΠΠ°Π»Π΅Π΅ ΠΌΡ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sigsuspend ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΠΌ ΡΠΈΠ³Π½Π°Π». ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ sigsuspend ΠΌΡ Π½Π΅ Π²ΡΠΉΠ΄Π΅ΠΌ ΠΈΠ· ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΡΡΡΠΏΠΈΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠ³Π½Π°Π». ΠΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ Π³ΠΎΠ½ΠΎΠΊ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 20.5
Π Π°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΎΡΠ²Π΅ΡΠ°46-51 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ ΡΠΈΠ³Π½Π°Π» SIGIO Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° sigprocmask, ΡΡΠΎΠ±Ρ Π²Π΅ΡΠ½ΡΡΡ ΠΌΠ°ΡΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΠΎΠ΅ ΡΠ°Π½Π΅Π΅ (oldmask). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠ²Π΅Ρ ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sendto. ΠΠ½Π΄Π΅ΠΊΡ iget ΡΠ²Π΅Π»ΠΈΡΠΈΠ»ΡΡ Π½Π° 1, ΠΈ Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΎΠ½ ΡΠ½ΠΎΠ²Π° ΠΎΠ±Π½ΡΠ»ΡΠ΅ΡΡΡ. ΠΠ°ΡΡΠΈΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ Π±ΡΡΠ΅Ρ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π» SIGIO Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ iget, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ SIGIO52-54 Π‘ΠΈΠ³Π½Π°Π» SIGIO Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ, Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ nqueue ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ Π½Π° 1. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π», ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠΎΠ±Ρ ΡΠΈΠ³Π½Π°Π» SIGIO Π±ΡΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΊΠΎΠ³Π΄Π° Π² Π½Π°ΡΠ°Π»Π΅ ΡΠΈΠΊΠ»Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ nqueue.
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ sigprocmask, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡ Π²Π½ΡΡΡΠΈ ΡΠΈΠΊΠ»Π° for, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π° ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ: Π² ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π²Π΅ΡΡ ΡΠΈΠΊΠ» Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π΅, ΡΡΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π±ΡΡΡΡΠΎΡΡ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°. ΠΡΠΈ ΡΡΠΎΠΌ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠ΅ΡΡΡΡΡΡ (Π΅ΡΠ»ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π±ΡΡΠ΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΎΠΊΠ΅ΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΊ), Π½ΠΎ Π²ΡΠ΄Π°ΡΠ° ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΎΡΠ΅ΡΡΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π½Π° Π²ΡΠ΅ΠΌΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°. ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· Π·Π°Π΄Π°Ρ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΠΈΡΡΠΈΠ½Π³ 25.3. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGIO
//sigio/dgecho01.c
57 static void
58 sig_io(int signo)
59 {
60 ssize_t len;
61 int nread;
62 DG *ptr;
63 for (nread = 0;;) {
64 if (nqueue >= QSIZE)
65 err_quit("receive overflow");
66 ptr = &dg[iput];
67 ptr->dg_salen = clilen;
68 len = recvfrom(sockfd, ptr->dg_data, MAXDG, 0,
69 ptr->dg_sa, &ptr->dg_salen);
70 if (len < 0) {
71 if (errno == EWOULDBLOCK)
72 break; /* Π²ΡΠ΅ ΡΠ΄Π΅Π»Π°Π½ΠΎ; ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ */
73 else
74 err_sys("recvfrom error");
75 }
76 ptr->dg_len = len;
77 nread++;
78 nqueue++;
79 if (++iput >= QSIZE)
80 iput = 0;
81 }
82 cntread[nread]++; /* Π³ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ.
ΡΡΠΈΡΠ°Π½Π½ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° */
83 }
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π±ΡΠ»Π° ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ POSIX ΡΠΈΠ³Π½Π°Π»Ρ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠ΅Π±ΡΠ²Π°Π½ΠΈΡ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² (ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΈΠ³Π½Π°Π» Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½) Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π΅ΡΠ΅ Π΄Π²Π° ΡΠΈΠ³Π½Π°Π»Π°, ΡΠΎ ΡΠΈΠ³Π½Π°Π» Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ POSIX ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΡΠ΄ Π΄ΡΡΠ³ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ SIGIO, ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ Π±ΡΡΠ΅ΡΠΈΠ·ΡΡΡΡΡ, ΡΠΎ Π΅ΡΡΡ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° Π΄ΠΎΡΡΠ°Π²ΠΊΡ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ. ΠΡΠΈΠ±ΡΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ° ΠΈ Π²ΡΠ΄Π°Π΅ΡΡΡ ΡΠΈΠ³Π½Π°Π». ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΡΠΈΠΊΠ»Ρ. ΠΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π΅ΡΠ΅ Π΄Π²Π΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, Π²ΡΠ·ΡΠ²Π°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠΈΠ³Π½Π°Π»Π° Π΅ΡΠ΅ Π΄Π²Π°ΠΆΠ΄Ρ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΈΠ³Π½Π°Π» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°, ΠΎΠ½ Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΡΠ½ΠΎΠ²Π° Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·. ΠΠΎΡΠ»Π΅ Π²ΡΠΎΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΠΎΡΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, Π° ΡΡΠ΅ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡΠΈΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ΡΠΎΠΊΠ΅ΡΠ°. ΠΡΠ° ΡΡΠ΅ΡΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½Π°, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ (ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π°) ΠΏΡΠΈΠ΄Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡΠ°Ρ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ΄Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡΠ°Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ°, ΡΡΠΈΡΠ°Π½Π° ΠΈ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ΅ΡΡΡ, Π° Π½Π΅ ΡΠ΅ΡΠ²Π΅ΡΡΠ°Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ°.