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

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

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

23 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ sem_close, хотя, Ссли Π±Ρ‹ ΠΌΡ‹ Π½Π΅ сдСлали этот Π²Ρ‹Π·ΠΎΠ², сСмафор всС Ρ€Π°Π²Π½ΠΎ закрылся Π±Ρ‹ автоматичСски ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса ΠΈ рСсурсы систСмы Π±Ρ‹Π»ΠΈ Π±Ρ‹ высвобоТдСны.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° semunlink

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 10.4 удаляСт ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор.

Листинг 10.4. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ сСмафора

//pxsem/semunlink.c

1 #include "unpipc.h"


2 int

3 main(int argc, char **argv)

4 {

5  if (argc != 2)

6   err_quit("usage: semunlink <name>");

7  Sem_unlink(argv[1]);

8  exit(0);

9 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° semgetvalue

Π’ листингС 10.5 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ.

Листинг 10.5. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ значСния сСмафора

//pxsem/semgetvalue.с

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   sem_t *sem;

6   int val;

7   if (argc != 2)

8    err_quit("usage: semgetvalue <name>");

9   sem = Sem_open(argv[1], 0);

10  Sem_getvalue(sem, &val);

11  printf("value = %d\n", val);

12  exit(0);

13 }

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сСмафора

9 Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ создан Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ sem_open Π±ΡƒΠ΄Π΅Ρ‚ 0: ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„Π»Π°Π³ O_CREAT ΠΈ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² открытия 0_Ρ…Ρ…Ρ….

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° semwait

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 10.6 ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ semwait (которая приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора мСньшС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎ 0, Π° ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ сСмафора ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° 1), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора, Π° Π·Π°Ρ‚Π΅ΠΌ останавливаСт свою Ρ€Π°Π±ΠΎΡ‚Ρƒ навсСгда ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ pause.

Листинг 10.6. ОТиданиС измСнСния значСния сСмафора ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния

//pxsem/semwait.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   sem_t *sem;

6   int val;

7   if (argc != 2)

8    err_quit("usage: semwait <name>");

9   sem = Sem_open(argv[1], 0);

10  Sem_wait(sem);

11  Sem_getvalue(sem, &val);

12  printf("pid %ld has semaphore, value = %d\n", (long) getpid(), val);

13  pause(); /* блокируСтся, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ */

14  exit(0);

15 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° sempost

Π’ листингС 10.7 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ post для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ сСмафора (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° 1), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого сСмафора ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ.

Листинг 10.7. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ значСния сСмафора

//pxsem/sempost.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   sem_t *sem;

6   int val;

7   if (argc != 2)

8    err_quit("usage: sempost <name>");

9   sem = Sem_open(argv[1], 0);

10  Sem_post(sem);

11  Sem_getvalue(sem, &val);

12  printf("value = %d\n", val);

13  exit(0);

14 }

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Для Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создадим ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор Π² Digital Unix 4.0B ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, устанавливаСмоС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

alpha % semcreate /tmp/test1

alpha % ls-l /tmp/test1

-rw-r--r-- 1 rstevens system 264 Nov 13 08:51 /tmp/test1

alpha %semgetvalue /tmp/test1

value = 1

Аналогично очСрСдям сообщСний Posix систСма создаСт Ρ„Π°ΠΉΠ» сСмафора с Ρ‚Π΅ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π΅ΠΌ измСнСния сСмафора ΠΈ ΠΏΡ€Π΅Ρ€Π²Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ:

alpha % semwait /tmp/test1

pid 9702 has semaphore, value = 0 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· sem_wait

^?                                клавиша прСрывания Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² нашСй систСмС

alpha % semgetvalue /tmp/test1

value = 0                         Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ остаСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ упомянутыС Ρ€Π°Π½Π΅Π΅ особСнности. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΆΠΈΠ²ΡƒΡ‡Π΅ΡΡ‚ΡŒΡŽ ядра. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, установлСнноС ΠΏΡ€ΠΈ создании сСмафора, хранится Π² ядрС Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½ΠΈ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ этим сСмафором. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ semwait, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅ΠΉ сСмафор, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Π½Π΅ измСняСтся, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ рСсурс остаСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ сСмафоры ΠΎΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ fcntl, описанных Π² Π³Π»Π°Π²Π΅ 9, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ снимались автоматичСски ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса.

ПокаТСм Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ Π² этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ количСствС процСссов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… разблокирования сСмафора:

alpha % semgetvalue /tmp/test1

value = 0                          это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ с ΠΊΠΎΠ½Ρ†Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

alpha % semwait /tmp/test1 &      Π·Π°ΠΏΡƒΡΠΊ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅

[1] 9718                           блокируСтся Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ измСнСния значСния сСмафора

alpha % semgetvalue /tmp/test1

value = –1                         ΠΎΠ΄ΠΈΠ½ процСсс ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ измСнСния сСмафора

alpha % semwait /tmp/test1 &       запуск Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅

[2] 9727                           ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ блокируСтся

alpha % semgetvalue /tmp/test1

value = –2                         Π΄Π²Π° процСсса ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ измСнСния сСмафора

alpha % sempost /tmp/test1

value = –1                         Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послС возвращСнияиз sem_post

pid 9718 has semaphore, value = –1 Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ semwait

alpha % sempost /tmp/test1

value = 0

pid 9727 has semaphore, value = 0  Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ semwait

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ sem_post Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора измСнилось с –2 Π½Π° –1 ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· процСссов, ΠΎΠΆΠΈΠ΄Π°Π²ΡˆΠΈΡ… измСнСния значСния сСмафора, Π±Ρ‹Π» Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Π΅ ΠΆΠ΅ дСйствия Π² Solaris 2.6, обращая Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° различия Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

solaris % semcreate /test2

solaris % ls –l /tmp/.*test2*

-rw-r--r-- 1 rstevens other1 48 Nov 13 09:11 /tmp/.SEMDtest2

–rw-rw-rw– 1 rstevens other1  0 Nov 13 09:11 /tmp/.SEMLtest2

solaris % semgetvalue /test2

value = 1

Аналогично очСрСдям сообщСний Posix Ρ„Π°ΠΉΠ»Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /tmp, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ имя становится суффиксом ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ². Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ sem_open, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ», ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ доступа.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ядро Π½Π΅ осущСствляСт автоматичСского увСличСния значСния сСмафора ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ:

solaris % semwait /test2

pid 4133 has semaphore, value = 0

^? Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ прСрывания выполнСния

solaris % semgetvalue /test2

value = 0

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊ мСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора Π² этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ появлСнии Π½ΠΎΠ²Ρ‹Ρ… процСссов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… измСнСния значСния сСмафора:

solaris % semgetvalue /test2

value = 0                       Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ с ΠΊΠΎΠ½Ρ†Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

solaris % semwait /test2&       Π·Π°ΠΏΡƒΡΠΊ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅

[1] 4257                        ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° блокируСтся

solaris % semgetvalue /test2

value = 0                        Π² этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ

solaris % semwait /test2&        Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс

[2] 4263

solaris % semgetvalue /test2

value 0                          ΠΈ для Π΄Π²ΡƒΡ… ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… процСссов Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ остаСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ

solaris % sempost /test2          выполняСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ post

pid 4257 has semaphore, value = 0 Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ semwait

value = 0

solaris % sempost /test2

pid 4263 has semaphore, value = 0 Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ semwait

value = 0

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ выполнСния Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Π² Digital Unix 4.0B: послС измСнСния значСния сСмафора ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сразу ΠΆΠ΅ пСрСдаСтся ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΌΡƒ измСнСния сСмафора процСссу.

10.6. Π—Π°Π΄Π°Ρ‡Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.3 ΠΌΡ‹ описали ΡΡƒΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ нСсколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ заполняли массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обрабатывался ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ.