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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 83

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

. . .            процСсс 17977 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ

pid 17977: 32

pid 17976: 33    ядро ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ мСТдупроцСссами

. . .            процСсс 17976 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ

pid 17976: 707

pid 17978: 708   ядро ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами

. . .            процСсс 17978 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ

pid 17978: 852

pid 17977: 853   ядро ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами

. . .            ΠΈ Ρ‚.Π΄.

pid 17977: 29997

pid 17977: 29999 послСднСС Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Оно оказываСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ.

13.6. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний Π½Π° сСрвСр

ИзмСним нашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° запускаСтся сСрвСр, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ раздСляСмой памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ свои сообщСния. Π‘Π΅Ρ€Π²Π΅Ρ€ просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ содСрТимоС этих сообщСний, хотя Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ выполнял дСйствия, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½Ρƒ syslog, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описан Π² Π³Π»Π°Π²Π΅ 13 [24]. ΠœΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… сообщСния процСссов ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ сСрвСру ΠΎΠ½ΠΈ ΠΈΠΌΠΈ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ эти ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ сСрвСрами ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ прилоТСниям. НапримСр, сСрвСр Telnet являСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Π΄Π΅ΠΌΠΎΠ½Π° syslog, ΠΊΠΎΠ³Π΄Π° отправляСт Π΅ΠΌΡƒ сообщСния для занСсСния ΠΈΡ… Π² систСмный ΠΆΡƒΡ€Π½Π°Π».

ВмСсто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· описанных Ρ€Π°Π½Π΅Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (Ρ‡Π°ΡΡ‚ΡŒ 2) Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сообщСния Π² раздСляСмой памяти. Π­Ρ‚ΠΎ, разумССтся, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ синхронизации дСйствий ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΡ… сообщСния, ΠΈ сСрвСра, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ…. На рис. 13.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° схСма прилоТСния Π² Ρ†Π΅Π»ΠΎΠΌ.

Рис. 13.2. НСсколько ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ сообщСния сСрвСру Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ


ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ взаимодСйствиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²) ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ потрСбитСля (сСрвСр). РаздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ отобраТаСтся Π² адрСсноС пространство сСрвСра ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

Π’ листингС 13.8 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° cliserv2.h, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° структура ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ Π² раздСляСмой памяти.

Листинг 13.8. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ содСрТимоС раздСляСмой памяти

//pxshm/cliserv2.h

1  #include "unpipc.h"


2  #define MESGSIZE 256 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния Π² Π±Π°ΠΉΡ‚Π°Ρ…, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ноль */

3  #define NMESG 16 /* максимальноС количСство сообщСний */


4  struct shmstruct { /* структура, хранящаяся Π² раздСляСмой памяти */

5   sem_t mutex; /* Ρ‚Ρ€ΠΈ сСмафора Posix, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² памяти */

6   sem_t nempty;

7   sem_t nstored;

8   int nput; /* индСкс для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сообщСния */

9   long noverflow; /* количСство ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ */

10  sem_t noverflowmutex; /* Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для счСтчика ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ */

11  long msgoff[NMESG]; /* сдвиг для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· сообщСний */

12  char msgdata[NMESG * MESGSIZE]; /* сами сообщСния */

13 };

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ сСмафоры ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

5-8 Π’Ρ€ΠΈ сСмафора Posix, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π² памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅, для Ρ‡Π΅Π³ΠΎ сСмафоры использовались Π² Π·Π°Π΄Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.6. Π˜Ρ… ΠΈΠΌΠ΅Π½Π° mutex, nempty, nstored. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ nput Ρ…Ρ€Π°Π½ΠΈΡ‚ индСкс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ сообщСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ нСсколько ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, эта пСрСмСнная Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π° Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ хранится Π² раздСляСмой памяти вмСстС со всСми ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ

9-10 БущСствуСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ смоТСт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС ΠΈΠ·-Π·Π° отсутствия свободного мСста для Π½Π΅Π³ΠΎ. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ прСдставляСт собой сСрвСр для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сСрвСр FTP ΠΈΠ»ΠΈ HTTP), ΠΎΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ освобоТдСния мСста для сообщСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ написана Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ, Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»Π° счСтчик ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ (noverflow). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот счСтчик Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΎΠ±Ρ‰ΠΈΠΌ для всСх процСссов, ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΎ.

Π‘Π΄Π²ΠΈΠ³ΠΈ сообщСний ΠΈ ΠΈΡ… содСрТимоС

11-12 Массив msgoff содСрТит сдвиги сообщСний Π² массивС msgdata, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сообщСния хранятся подряд. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сдвиг ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сообщСния msgoff[0] = 0, msgoff [1] = 256 (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MESGSIZE), msgoff [2] = 512 ΠΈ Ρ‚. Π΄.

НуТно ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с раздСляСмой ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сдвиг Π² Ρ‚Π°ΠΊΠΈΡ… случаях Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ раздСляСмой памяти ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π² Ρ€Π°Π·Π½Ρ‹Π΅ области адрСсного пространства процСсса (ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Ρ€Π°Π·Π½Ρ‹Ρ… физичСских адрСсов). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ mmap Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ раздСляСмой памяти нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, содСрТащиС Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ адрСса ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² этом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

Π’ листингС 13.9 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-сСрвСра, которая ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ помСщСния сообщСний Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΡ….

Листинг 13.9. Π‘Π΅Ρ€Π²Π΅Ρ€, ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сообщСния ΠΈΠ· раздСляСмой памяти

//pxshm/server2.c

1  #include "cliserv2.h"


2  int

3  main(int argc, char **argv)

4  {

5   int fd, index, lastnoverflow, temp;

6   long offset;

7   struct shmstruct *ptr;

8   if (argc != 2)

9    err_quit("usage: server2 <name>");

10  /* созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° раздСляСмой памяти, установка Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ дСскриптора */

11  shm_unlink(Px_ipc_name(argv[1])); /* ошибка игнорируСтся */

12  fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR | O_CREAT | O_EXCL, FILE_MODE);

13  ptr = Mmap(NULL, sizeof(struct shmstruct), PROT_READ | PROT_WRITE,

14   MAP_SHARED, fd, 0);

15  Ftruncate(fd, sizeof(struct shmstruct));

16  Close(fd);

17  /* инициализация массива сдвигов */

18  for (index = 0; index < NMESG; index++)

19   ptr->msgoff[index] = index * MESGSIZE;

20  /* инициализация сСмафоров Π² раздСляСмой памяти */

21  Sem_init(&ptr->mutex, 1, 1);

22  Sem_init(&ptr->nempty, 1, NMESG);

23  Sem_init(&ptr->nstored, 1, 0);

24  Sem_init(&ptr->noverflowmutex, 1, 1);

25  /* ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ */

26  index = 0;

27  lastnoverflow = 0;

28  for (;;) {

29   Sem_wait(&ptr->nstored);

30   Sem_wait(&ptr->mutex);

31   offset = ptr->msgoff[index];

32   printf("index = %d: %s\n", index, &ptr->msgdata[offset]);

33   if (++index >= NMESG)

34    index =0; /* цикличСский Π±ΡƒΡ„Π΅Ρ€ */

35   Sem_post(&ptr->mutex);

36   Sem_post(&ptr->nempty);

37   Sem_wait(&ptr->noverflowmutex);

38   temp = ptr->noverflow; /* Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ, ΠΏΠΎΠΊΠ° Π½Π΅ снимСм Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ */

39   Sem_post(&ptr->noverflowmutex);

40   if (temp != lastnoverflow) {

41    printf("noverflow = %d\n", temp);

42    lastnoverflow = temp;

43   }

44  }

45  exit(0);

46 }

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° раздСляСмой памяти

10-16 Π‘Π½Π°Ρ‡Π°Π»Π° дСлаСтся Π²Ρ‹Π·ΠΎΠ² shm_unlink, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ послС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ прилоТСния. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ раздСляСмой памяти создаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ shm_open ΠΈ отобраТаСтся Π² адрСсноС пространство процСсса Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ mmap, послС Ρ‡Π΅Π³ΠΎ дСскриптор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° закрываСтся.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива сдвигов

17-19 Массив сдвигов инициализируСтся сдвигами сообщСний.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ сСмафоров

20-24 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ сСмафора, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ раздСляСмой памяти. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ sem_init всСгда дСлаСтся Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСмафоры Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно нСсколькими процСссами.

ОТиданиС сообщСния, Π²Ρ‹Π²ΠΎΠ΄ Π΅Π³ΠΎ содСрТимого

25-36 ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Ρ†ΠΈΠΊΠ»Π° for написана ΠΏΠΎ стандартному Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ потрСбитСля: ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ измСнСния сСмафора nstored, установка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для сСмафора mutex, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ значСния сСмафора nempty.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ

37-43 ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ провСряСм Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΡˆΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ. БравниваСтся Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ noverflows с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСнилось, ΠΎΠ½ΠΎ выводится Π½Π° экран ΠΈ сохраняСтся. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ считываСтся с Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ noverflowmutex, Π½ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снимаСтся ΠΏΠ΅Ρ€Π΅Π΄ сравнСниСм ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ значСния. ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ всСгда ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ количСства ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых с Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ. Π’ листингС 13.10 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Листинг 13.10. ΠšΠ»ΠΈΠ΅Π½Ρ‚, ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ сообщСния Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ

//pxshm/client2.c

1  #include "cliserv2.h"


2  int

3  main(int argc, char **argv)

4  {

5   int fd, i, nloop, nusec;

6   pid_t pid;

7   char mesg[MESGSIZE];

8   long offset;

9   struct shmstruct *ptr;

10  if (argc != 4)