ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄ΡΠ° Unix ΡΠ½Π°Π±ΠΆΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° [107]. Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ½Π° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ wakeup_one.
Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
Π‘Π»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ accept. ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ main, ΡΠ°Π·ΠΌΠ΅ΡΠ°Ρ Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ² ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΡΠ΅Π»ΡΠ΅ ΡΠΈΡΠ»Π° (ΠΎΠ΄ΠΈΠ½ ΡΡΠ΅ΡΡΠΈΠΊ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ). ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
long *cptr, *meter(int); /* Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Π½Π° ΠΎΠ΄ΠΈΠ½
Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
cptr = meter(nchildren); /* ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° */
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ meter.
ΠΠΈΡΡΠΈΠ½Π³ 30.10. Π€ΡΠ½ΠΊΡΠΈΡ meter, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ
//server/meter.c
1 #include "unp.h"
2 #include <sys/mman.h>
3 /* Π Π°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² "nchildren" Π΄Π»ΠΈΠ½Π½ΡΡ ΡΠ΅Π»ΡΡ ΡΠΈΡΠ΅Π»
4 * Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
5 * ΠΡΠΈ ΡΠΈΡΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΡΠ΅ΡΡΠΈΠΊΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π°
* ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΠΎΠ±ΡΠ»ΡΠΆΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΠΌ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ,
6 * ΡΠΌ. Ρ. 467-470 ΠΊΠ½ΠΈΠ³ΠΈ [110]"
7 */
8 long*
9 meter(int nchildren)
10 {
11 int fd;
12 long *ptr;
13 #ifdef MAP_ANON
14 ptr = Mmap(0, nchildren * sizeof(long), PROT_READ | PROT_WRITE,
15 MAP_ANON | MAP_SHARED, -1, 0);
16 #else
17 fd = Open("/dev/zero", O_RDWR, 0);
18 ptr = Mmap(0, nchildren * sizeof(long), PROT_READ | PROT_WRITE,
19 MAP_SHARED, fd, 0);
20 Close(fd);
21 #endif
22 return (ptr);
23 }
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² 4.4BSD), ΠΈΠ»ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° /dev/zero (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, SVR4). ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mmap Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅, ΡΡΠΎΡ ΠΌΠ°ΡΡΠΈΠ² Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΈ Π²ΡΠ΅ΠΌΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fork.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ child_main (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 30.9) ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ accept, Π° ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGINT Π²ΡΠ²ΠΎΠ΄ΠΈΠ» Π±Ρ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ².
Π ΡΠ°Π±Π». 30.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ. ΠΠΎΠ³Π΄Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ accept, ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ Π² ΡΠ΄ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π°Π³ΡΡΠ·ΠΊΡ, ΡΠ°ΠΊ ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ².
ΠΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ select
Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ Π΄Π°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π² 4.4BSD, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΡΡΠΎ ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠΎΠΉ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 16.13 [128] Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ ΠΎ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΡΡ (collisions), Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ select Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅, ΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ΄ΡΠΎ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π‘ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π² ΡΡΡΡΠΊΡΡΡΠ΅ socket ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠΎ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ , ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ² Π΄Π°Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΡΠΎ ΡΠ΄ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΡΠ²Π΅ΡΡΠΈ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ select, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΄ΡΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°.
ΠΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ select Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΡΠ΅Π΄Π²Π°ΡΡΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ accept ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 30.9 Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ select Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΊ ΡΡΠ΅Π½ΠΈΡ Π½Π° ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠΌ ΡΠΎΠΊΠ΅ΡΠ΅. ΠΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π±ΡΠ΄ΡΡ ΡΠ΅ΠΏΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ select, Π° Π½Π΅ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ accept. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.11 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ child_main, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π»ΠΈΡΡΠΈΠ½Π³Ρ 30.9 ΡΡΡΠΎΠΊΠΈ ΠΎΡΠΌΠ΅ΡΠ΅Π½Ρ Π·Π½Π°ΠΊΠ°ΠΌΠΈ +.
ΠΠΈΡΡΠΈΠ½Π³ 30.11. ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 30.9: Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π²ΡΠ·ΠΎΠ²Π΅ select Π²ΠΌΠ΅ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ accept
printf("child %ld starting\n", (long)getpid());
+ FD_ZERO(&rset);
for (;;) {
+ FD_SET(listenfd, &rset);
+ Select(listenfd+1, &rset, NULL, NULL, NULL);
+ if (FD_ISSET(listenfd, &rset) == 0)
+ err_quit("listenfd readable");
+
clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);
web_child(connfd); /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ° */
Close(connfd);
}
ΠΡΠ»ΠΈ, ΠΏΡΠΎΠ΄Π΅Π»Π°Π² ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΠ΄ΡΠ° BSD/OS nselcoll, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ 1814 ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ, Π° Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β 2045. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄Π²Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΎΠ·Π΄Π°ΡΡ Π² ΡΡΠΌΠΌΠ΅ 5000 ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² 35-40% ΡΠ»ΡΡΠ°Π΅Π² Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ select ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΡΠΌ.
ΠΡΠ»ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, ΡΡΠΎ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ select ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Ρ 1,8 Π΄ΠΎ 2,9 Ρ. Π§Π°ΡΡΠΈΡΠ½ΠΎ ΡΡΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° (ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ accept, Π½ΠΎ Π΅ΡΠ΅ ΠΈ select), Π° ΡΠ°ΡΡΠΈΡΠ½ΠΎ β Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠΌΠΈ ΡΠ°ΡΡ ΠΎΠ΄Π°ΠΌΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌΠΈ Ρ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΡΠΌΠΈ.
ΠΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅, Π»ΡΡΡΠ΅, ΡΡΠΎΠ±Ρ ΡΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π±ΡΠ»Π° ΡΠ²ΡΠ·Π°Π½Π° Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ accept, Π° Π½Π΅ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ select.
30.7. Π‘Π΅ΡΠ²Π΅Ρ TCP Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ Π·Π°ΡΠΈΡΠΎΠΉ Π²ΡΠ·ΠΎΠ²Π° accept Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ ΡΠ°ΠΉΠ»Π°
ΠΠΏΠΈΡΠ°Π½Π½Π°Ρ Π²ΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ accept Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌ 4.4BSD, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ accept ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²Π½ΡΡΡΠΈ ΡΠ΄ΡΠ°. Π―Π΄ΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ SVR4, Π² ΠΊΠΎΡΠΎΡΡΡ accept ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ ΡΡΠΎΠ³ΠΎ. Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π² Solaris 2.5 (ΡΠΈΡΡΠ΅ΠΌΠ° SVR4), ΡΠΎ Π²ΡΠΊΠΎΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½Π°ΡΠ½ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ accept Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ EPROTO, ΡΡΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΠ΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΡΠΈΡΠΈΠ½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ accept Π² SVR4 ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ² STREAMS ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΊΡΠΎΠΌ, ΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ accept Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ. Π Solaris 2.6 ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ΡΠ΅Π½Π°, Π½ΠΎ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ SVR4 ΠΎΠ½Π° ΠΎΡΡΠ°Π΅ΡΡΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΡΠΈΡΠ° Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ accept ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΡΠ°ΠΊ ΡΡΠΎ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΡΡΡΠ΅ΠΌΠΈΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ accept.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΡΠΈΡΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ accept, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠΎΠΌΠ΅[2] Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅ΡΠΈΠΈ. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π° ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fcntl ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ POSIX.
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π² ΡΡΠ½ΠΊΡΠΈΠΈ main (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 30.6) Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ my_lock_init ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ ΡΠΈΠΊΠ»Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ:
+ my_lock_init("/tmp/lock.XXXXXX"); /* ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» Π΄Π»Ρ Π²ΡΠ΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² */
for (i = 0; i < nchildren; i++)
pids[i] = child_make(i, listenfd, addrlen); /* Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅
ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° */
Π€ΡΠ½ΠΊΡΠΈΡ child_make ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.8. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ child_main (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 30.9) ΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ accept ΠΈ ΡΠ½ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ:
for (;;) {
clilen = addrlen;
+ my_lock_wait();
connfd = Accept(listenfd, cliaddr, &clilen);
+ my_lock_release();
web_child(connfd); /* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ° */
Close(connfd);
}
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.12 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ my_lock_init, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ POSIX.
ΠΠΈΡΡΠΈΠ½Π³ 30.12. Π€ΡΠ½ΠΊΡΠΈΡ my_lock_init: Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π°
//server/lock_fcntl.c
1 #include "unp.h"
2 static struct flock lock_it, unlock_it;
3 static int lock_fd = -1;