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

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

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

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 Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ.