11 err_quit("usage: client2 <name> <#loops> <#usec>");
12 nloop = atoi(argv[2]);
13 nusec = atoi(argv[3]);
14 /* ΠΎΡΠΊΡΡΡΠΈΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π·Π°ΡΠ°Π½Π΅Π΅ */
15 fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR, FILE_MODE);
16 ptr = Mmap(NULL, sizeof(struct shmstruct), PROT_READ | PROT_WRITE,
17 MAP_SHARED, fd, 0);
18 Close(fd);
19 pid = getpid();
20 for (i = 0; i < nloop; i++) {
21 Sleep_us(nusec);
22 snprintf(mesg, MESGSIZE, "pid %ld; message %d", (long) pid, i);
23 if (sem_trywait(&ptr->nempty) == β1) {
24 if (errno == EAGAIN) {
25 Sem_wait(&ptr->noverflowmutex);
26 ptr->noverflow++;
27 Sem_post(&ptr->noverflowmutex);
28 continue;
29 } else
30 err_sys("sem_trywait error");
31 }
32 Sem_wait(&ptr->mutex);
33 offset = ptr->msgoff[ptr->nput];
34 if (++(ptr->nput) >= NMESG)
35 ptr->nput = 0; /* ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π±ΡΡΠ΅Ρ */
36 Sem_post(&ptr->mutex);
37 strcpy(&ptr->msgdata[offset], mesg);
38 Sem_post(&ptr->nstored);
39 }
40 exit(0);
41 }
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ10-13 ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π·Π°Π΄Π°Π΅Ρ ΠΈΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ; Π²ΡΠΎΡΠΎΠΉ β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ ΡΠ΅ΡΠ²Π΅ΡΡ Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π·Π°Π΄Π°Π΅Ρ ΠΏΠ°ΡΠ·Ρ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ). ΠΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π·Π°ΠΏΡΡΡΠΈΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠΊΠ°Π·Π°Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΏΠ°ΡΠ·Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΡΠΊΡΡΡΠΈΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ14-18 ΠΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΎΠ½ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½ ΠΈ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΊΡΡΡ.
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ19-31 ΠΠ»ΠΈΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ ΠΏΡΠΎΡΡΠΎΠΌΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π° sem_wait(nempty), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ» Π±Ρ ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΌΠ΅ΡΡΠ° Π² Π±ΡΡΠ΅ΡΠ΅ Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ sem_trywait β ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π½ΡΠ»Π΅Π²ΠΎΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° EAGAIN. ΠΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
sleep_us β ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠ² Π‘.9 ΠΈ Π‘.10 [21]. ΠΠ½Π° ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄. Π Π΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ select ΠΈΠ»ΠΈ poll.
32-37 ΠΠΎΠΊΠ° Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ ΡΠ΅ΠΌΠ°ΡΠΎΡ mutex, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΄Π²ΠΈΠ³Π° (offset) ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΡΠ΅ΡΡΠΈΠΊ nput, Π½ΠΎ ΠΌΡ ΡΠ½ΠΈΠΌΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Ρ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΠΎΠ³Π΄Π° ΡΠ΅ΠΌΠ°ΡΠΎΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
Π‘Π½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠΊΠ°Π·Π°Π² 50 ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ Π½ΡΠ»Π΅Π²ΡΡ ΠΏΠ°ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ:
solaris % server2 serv2 &
[2] 27223
solaris % client2 serv250 0
index = 0: pid 27224: message 0
index = 1: pid 27224: message 1
index = 2: pid 27224: message 2
β¦ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π² ΡΠΎΠΌ ΠΆΠ΅ Π΄ΡΡ Π΅
index = 15: pid 27224: message 47
index = 0: pid 27224: message 48
index = 1: pid 27224: message 49 Π½Π΅Ρ ΡΡΠ΅ΡΡΠ½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½Ρ Π΅ΡΠ΅ ΡΠ°Π·, ΡΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ.
solaris % client2 serv250 0
index = 2: pid 27228: message 0
index = 3: pid 27228: message 1
β¦ ΠΏΠΎΠΊΠ° Π²ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅
index = 10: pid 27228: message 8
index = 11: pid 27228: message 9
noverflow = 25 ΡΡΠ΅ΡΡΠ½ΠΎ 25 ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
index = 12: pid 27228: message 10
index = 13: pid 27228: message 11
β¦ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ 12-22
index = 9: pid 27228: message 23
index = 10: pid 27228: message 24
ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ 0-9, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΠΈ Π²ΡΠ²Π΅Π΄Π΅Π½Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. ΠΠ°ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ½ΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ» ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ 10-49, Π½ΠΎ ΠΌΠ΅ΡΡΠ° Ρ Π²Π°ΡΠΈΠ»ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΡΡ 15, Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ 25 (Ρ 25 ΠΏΠΎ 49) Π½Π΅ Π±ΡΠ»ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ ΠΈΠ·-Π·Π° ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊ ΡΠ°ΡΡΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π΄Π΅Π»Π°Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΠΏΠ°ΡΠ·. Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅ ΡΠ°ΠΊΠΎΠ΅ ΡΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ΅Π΄ΠΊΠΎ. Π¦Π΅Π»ΡΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅Ρ, Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ. Π’Π°ΠΊΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π½ΠΎ ΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΈ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ².
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° Π΄Π°Π½Π½ΡΠΌΠΈ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 8.13 [24] ΠΎΠ±ΡΡΠΆΠ΄Π°Π»Π°ΡΡ ΡΠ°ΠΊΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Π² ΡΠ²ΡΠ·ΠΈ Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ UDP ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΡΠΌ Π±ΡΡΠ΅ΡΠΎΠΌ ΡΠΎΠΊΠ΅ΡΠ° UDP. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 18.2 [23] ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ Unix Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΎΡΠΈΠ±ΠΊΡ ENOBUFS ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ. ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° UDP. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°-ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 13.10 ΡΠ·Π½Π°Π΅Ρ ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΡΡΠ΅ΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π·Π°ΡΠ΅ΠΌ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΡΡΠ΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°.
13.7. Π Π΅Π·ΡΠΌΠ΅
Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ Posix ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mmap, ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠ΅ΠΉΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅. Π‘Π½Π°ΡΠ°Π»Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ shm_open Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Posix IPC Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mmap. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ, Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ Posix Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ».
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΡΠ΅ΡΠ΅Π· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ftruncate, Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ (Π±ΠΈΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π³ΡΡΠΏΠΏΡ, ΡΠ°Π·ΠΌΠ΅Ρ) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fstat.
Π Π³Π»Π°Π²Π°Ρ , ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΡ ΠΎΠ± ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°Ρ Posix, ΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ (ΡΠ°Π·Π΄Π΅Π»Ρ 5.8 ΠΈ 10.15). ΠΠ»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Posix ΠΌΡ ΡΡΠΎΠ³ΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Π°. ΠΡΠ»ΠΈ ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠ°ΠΉΠ» (ΡΡΠΎ ΠΈ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² Solaris ΠΈ Digital Unix), shm_open ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· open, a shm_unlink β ΡΠ΅ΡΠ΅Π· unlink.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ
1. ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠ² 12.6 ΠΈ 12.7 ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ Posix, Π° Π½Π΅ Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠΌ Π² ΠΏΠ°ΠΌΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠΌ. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π±ΡΠ΄ΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΌΡΡΡ ΡΠ°ΠΉΠ»Π°.
2. Π ΡΠΈΠΊΠ»Π°Ρ for Π² Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ 13.3 ΠΈ 13.4 ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° *ptr++ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΠ΅ Π»ΡΡΡΠ΅ Π»ΠΈ Π±ΡΠ»ΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ptr[i]?
ΠΠΠΠΠ 14
Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ System V
14.1. ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ System V ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠ΅ΠΉ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Posix. ΠΠΌΠ΅ΡΡΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² shm_open ΠΈ mmap Π² ΡΡΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π²ΡΠ·ΠΎΠ²Ρ shmget ΠΈ shmat.
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΄ΡΠΎ Ρ ΡΠ°Π½ΠΈΡ Π½ΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <sys/shm.h>:
struct shmid_ds {
struct ipc_perm shm_perm; /* ΡΡΡΡΠΊΡΡΡΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ */
size_t shm_segsz; /* ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° */
pid_t shm_lpid; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ²ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ */
pid_t shm_cpid; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°-ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ */
shmatt_t shm_nattch; /* ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ */
shmat_t shm_cnattch; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ in-core */
time_t shm_atime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ */
time_t shm_dtime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ */
time_t shm_ctime; /* Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ */
};
Π‘ΡΡΡΠΊΡΡΡΠ° ipc_perm Π±ΡΠ»Π° ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 3.3; ΠΎΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ.
14.2. Π€ΡΠ½ΠΊΡΠΈΡ shmget
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ shmget ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌΡ:
#include <sys/shm.h>
int shmget(key_t key, size_t size, int oflag);
/* ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ. β1 βΠ² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ */
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ ΡΡΠ΅ΠΌΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ shmXXX.
ΠΡΠ³ΡΠΌΠ΅Π½Ρ key ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ftok, ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ IPC_PRIVATE, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΎΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 3.2.
ΠΡΠ³ΡΠΌΠ΅Π½Ρ size ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ . ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠ°Π·ΠΌΠ΅Ρ. ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ, Π°ΡΠ³ΡΠΌΠ΅Π½Ρ size Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ.