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

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

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

11.6. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСмафоров System V ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ my_lock ΠΈ my_unlock ΠΈΠ· листинга 10.10. Новый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.6.

Листинг 11.6. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСмафоров System V

//lock/locksvsem.c

1  #include "unpipc.h"

2  #define LOCK_PATH "/tmp/svsemlock"

3  #define MAX_TRIES 10

4  int semid, initflag;

5  struct sembuf postop, waitop;


6  void

7  my_lock (int fd)

8  {

9   int oflag, i;

10  union semun arg;

11  struct semid_ds seminfo;

12  if (initflag == 0) {

13   oflag = IPC_CREAT | IPC_EXCL | SVSEM_MODE;

14   if ((semid = semget(Ftok(LOCK_PATH, 0), 1, oflag)) >= 0) {

15    /* этот процСсс создал сСмафор ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΎΠ½ ΠΆΠ΅ Π΅Π³ΠΎ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ */

16    arg.val = 1;

17    Semctl(semid, 0, SETVAL, arg);

18   } else if (errno == EEXIST) {

19    /* сСмафор создан Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом, убСдимся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ */

20    semid = Semget(Ftok(LOCK_PATH, 0), 1, SVSEM_MODE);

21    arg.buf = &seminfo;

22    for (i = 0; i < MAX_TRIES; i++) {

23     Semctl(semid, 0, IPC_STAT, arg);

24     if (arg.buf->sem_otime != 0)

25      goto init;

26     sleep(1);

27    }

28    err_quit("semget OK, but semaphore not initialized");

29   } else

30    err_sys("semget error");

31 init:

32   initflag = 1;

33   postop.sem_num = 0; /* ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π²Π΅ структуры semop()*/

34   postop.sem_op = 1;

35   postop.sem_flg = SEM_UNDO;

36   waitop.sem_num = 0;

37   waitop.sem_op = –1;

38   waitop.sem_flg = SEM_UNDO;

39  }

40  Semop(semid, &waitop, 1); /* ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠΌ Π½Π° 1 */

41 }


42 void

43 my_unlock(int fd)

44 {

45  Semop(semid, &postop, 1); /* ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠΌ Π½Π° 1*/

46 }

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ создания

13-17 Нам Π½ΡƒΠΆΠ½ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ процСсс ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ сСмафор, поэтому ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ semget ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„Π»Π°Π³ΠΈ IPC_CREAT | IPC_EXCL. Если этот Π²Ρ‹Π·ΠΎΠ² оказываСтся ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ, процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ semctl для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафора Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1. Если ΠΌΡ‹ запустим нСсколько процСссов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ всС ΠΎΠ½ΠΈ Π²Ρ‹Π·ΠΎΠ²ΡƒΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ my_lock, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… создаст сСмафор (прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт) ΠΈ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ.

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ ΡƒΠΆΠ΅ сущСствуСт, ΠΌΡ‹ Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ

18-20 Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² semget Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EEXIST, процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ semget Π΅Ρ‰Π΅ Ρ€Π°Π·, Π½ΠΎ ΡƒΠΆΠ΅ Π±Π΅Π· Ρ„Π»Π°Π³ΠΎΠ² IPC_CREAT ΠΈ IPC_EXCL.

ОТиданиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафора

21-28 Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ такая ΠΆΠ΅ ситуация Π³ΠΎΠ½ΠΎΠΊ, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ°ΡΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 11.2, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафоров System V Π²ΠΎΠΎΠ±Ρ‰Π΅. Для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠΉ ситуации всС процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ сСмафор ΡƒΠΆΠ΅ создан, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ semctl с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ IPC_STAT, провСряя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ sem_otime Π΄Π°Π½Π½ΠΎΠ³ΠΎ сСмафора. Когда это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ становится Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ создавший сСмафор процСсс ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ ΠΈ Π²Ρ‹Π·Π²Π°Π» semop (этот Π²Ρ‹Π·ΠΎΠ² находится Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого поля оказываСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ (Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ), ΠΌΡ‹ приостанавливаСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса Π½Π° ΠΎΠ΄Π½Ρƒ сСкунду Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ sleep, Π° Π·Π°Ρ‚Π΅ΠΌ повторяСм ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ. Число ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ процСсс Π½Π΅ «заснул» навсСгда.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ структур sembuf

33-38 Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ порядок ΠΏΠΎΠ»Π΅ΠΉ структуры sembuf зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, поэтому статичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ нСльзя. ВмСсто этого ΠΌΡ‹ выдСляСм мСсто ΠΏΠΎΠ΄ Π΄Π²Π΅ Ρ‚Π°ΠΊΠΈΠ΅ структуры ΠΈ присваиваСм значСния ΠΈΡ… полям Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ my_lock Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·. ΠŸΡ€ΠΈ этом ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„Π»Π°Π³ SEM_UNDO, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ядро сняло Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ссли процСсс Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½Π΅ сняв Π΅Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ (см. ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.3).

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

11.7. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ сСмафоров System V

На сСмафоры System V Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ систСмныС ограничСния, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ этих ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π±Ρ‹Π»ΠΈ связаны с особСнностями Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ System V (Ρ€Π°Π·Π΄Π΅Π» 3.8). Они ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² Ρ‚Π°Π±Π». 11.1. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° содСрТит Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ΅ для System V имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ядра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ oΠ³Ρ€aΠ½ΠΈΡ‡eΠ½ΠΈe.


Π’Π°Π±Π»ΠΈΡ†Π° 11.1. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ значСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ для сСмафоров System V

Имя ОписаниС DUnix 4.0B Solaris 2.6 semmni МаксимальноС количСство Π½Π°Π±ΠΎΡ€ΠΎΠ² сСмафоров Π² систСмС 16 10 semmsl МаксимальноС количСство сСмафоров Π² Π½Π°Π±ΠΎΡ€Π΅ 25 25 semmns МаксимальноС количСство сСмафоров Π² систСмС 400 60 semopm МаксимальноС количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π·Π° ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² semop 10 10 semmnu МаксимальноС количСство структур undo Π² систСмС 30 semume МаксимальноС количСство записСй Π² структурС undo 10 10 semvmx МаксимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора 32767 32767 semaem МаксимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ 16384 16384

Π’ Digital Unix 4.0B Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ограничСния Π½Π° semmnu Π½Π΅ сущСствуСт.

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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 11.7 позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ограничСния, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π». 11.1.

Листинг 11.7. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ систСмных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° сСмафоры System V

//svsem/limits.c

1   #include "unpipc.h"


2   /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ провСряСтся */

3   #define MAX_NIDS 4096 /* максимальноС количСство ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² сСмафоров */

4   #define MAX_VALUE 1024*1024 /* максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора */

5   #define MAX_MEMBERS 4096 /* максимальноС количСство сСмафоров Π² Π½Π°Π±ΠΎΡ€Π΅ */

6   #define MAX_NOPS 4096 /* максимальноС количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π·Π° Π²Ρ‹Π·ΠΎΠ² semop */

7   #define MAX_NPROC Sysconf(_SC_CHILD_MAX)


8   int

9   main(int argc, char **argv)

10  {

11   int i, j, semid, sid[MAX_NIDS], pipefd[2];

12   int semmni, semvmx, semmsl, semmns, semopn, semaem, semume, semmnu;

13   pid_t *child;

14   union semun arg;

15   struct sembuf ops[MAX_NOPS];

16   /* сколько Π½Π°Π±ΠΎΡ€ΠΎΠ² с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ? */

17   for (i = 0; i <= MAX_NIDS; i++) {

18    sid[i] = semget(IPC_PRIVATE, 1, SVSEM_MODE | IPC_CREAT);

19    if (sid[i] == –1) {

20     semmni = i;

21     printf("%d identifiers open at once\n", semmni);

22     break;

23    }

24   }

25   /* ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ sid[0] */

26   for (j = 7; j < MAX_VALUE; j += 8) {

27    arg.val = j;

28    if (semctl(sid[0], 0, SETVAL, arg) == –1) {

29     semvmx = j – 8;

30     printf("max semaphore value = %d\n", semvmx);

31     break;

32    }

33   }

34   for (j = 0; j < i; j++)

35    Semctl(sid[j], 0, IPC_RMID);

36   /* опрСдСляСм максимальноС количСство сСмафоров Π² Π½Π°Π±ΠΎΡ€Π΅ */

37   for (i = 1; i <= MAX_MEMBERS; i++) {

38    semid = semget(IPC_PRIVATE, i, SVSEM_MODE | IPC_CREAT);

39    if (semid == –1) {

40     semmsl = i-1;

41     printf("max of %d members per set\n", semmsl);

42     break;

43    }

44    Semctl(semid, 0, IPC_RMID);

45   }

46   /* сколько всСго сСмафоров ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ? */

47   semmns = 0;

48   for (i = 0; i < semmni; i++) {

49    sid[i] = semget(IPC_PRIVATE, semmsl, SVSEM_MODE | IPC_CREAT);

50    if (sid[i] == –1) {