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

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

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

40-44 ΠœΡ‹ провСряСм Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΌ процСссом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСмафоры System V ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ хранятся ΠΊΠ°ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Ρ†Π΅Π»Ρ‹Π΅ (unsigned short, структура sem Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 11.1) с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 32767 (Ρ€Π°Π·Π΄Π΅Π» 11.7), Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ сСмафоры Posix ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ хранятся ΠΊΠ°ΠΊ Ρ†Π΅Π»Ρ‹Π΅ с максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ (Ρ€Π°Π·Π΄Π΅Π» 10.13). ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° SEMVMX опрСдСляСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ рСализациями ΠΊΠ°ΠΊ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора System V, Π° Ссли ΠΎΠ½Π° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚ΠΎ ΠΌΡ‹ опрСдСляСм Π΅Π΅ Ρ€Π°Π²Π½ΠΎΠΉ 32 767 Π² листингС 10.36.

52-53 Если сСмафор ΡƒΠΆΠ΅ сущСствуСт ΠΈ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ процСсс Π½Π΅ ΡƒΠΊΠ°Π·Π°Π» Ρ„Π»Π°Π³ O_EXCL, ошибка Π½Π΅ возвращаСтся. Π’ этом случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ (Π½Π΅ созданию) ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сСмафора.

Π’ листингС 10.38 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_open.

Листинг 10.38. Ѐункция sem_open: вторая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°

//my_pxsem_svsem/sem_open.c

55  /*

56   * (O_CREAT Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½) ΠΈΠ»ΠΈ

57   * (O_CREAT Π±Π΅Π· O_EXCL ΠΈ сСмафор ΡƒΠΆΠ΅ сущСствуСт).

58   * НуТно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ сСмафор ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½.

59   */

60  if ((key = ftok(pathname, 0)) == (key_t) –1)

61   goto err;

62  if ((semid = semget(key, 0, semflag)) == –1)

63 goto err;

64  arg.buf = &seminfo;

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

66   if (semctl(semid, 0, IPC_STAT, arg) == –1)

67    goto err;

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

69    goto finish;

70   sleep(1);

71  }

72  errno = ETIMEDOUT;

73 err:

74  save_errno = errno; /* Π½Π΅ Π΄Π°Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Ρƒ semctl() ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno */

75  if (semid != –1)

76   semctl(semid, 0, IPC_RMID);

77  errno = save_errno;

78  return(SEM_FAILED);

79 finish:

80  if ((sem = malloc(sizeof(mysem_t))) == NULL)

81   goto err;

82  sem->sem_semid = semid;

83  sem->sem_magic = SEM_MAGIC;

84  return(sem);

85 }

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сСмафора

55-63 Если сСмафор ΡƒΠΆΠ΅ создан (Ρ„Π»Π°Π³ O_CREAT Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Π½, Π½ΠΎ Π±Π΅Π· O_EXCL, Π° сСмафор сущСствуСт), ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сСмафор System V с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ semget. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ sem_open ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ mode Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ O_CREAT, Π½ΠΎ Π²Ρ‹Π·ΠΎΠ² semget Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания Ρ€Π΅ΠΆΠΈΠΌΠ° доступа, Π΄Π°ΠΆΠ΅ Ссли открываСтся ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ сСмафор. Π Π°Π½Π΅Π΅ Π² тСкстС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ присваивали Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (константу SVSEM_MODE ΠΈΠ· нашСго Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° unpipc.h) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ semget, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ O_CREAT.

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

64-72 ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ сСмафор ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, вызывая semctl с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ IPC_STAT ΠΈ сравнивая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля sem_otime Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ структуры с Π½ΡƒΠ»Π΅ΠΌ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊΠΎΠ΄Π° ошибки

73-78 Когда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка, ΠΌΡ‹ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno.

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ sem_t

79-84 ΠœΡ‹ выдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ структуру sem_t ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² Π½Π΅Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСмафора System V. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° эту структуру.

Ѐункция sem_close

Π’ листингС 10.39 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_close, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ free для освобоТдСния динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ структуру sem_t памяти. 

Листинг 10.39. Ѐункция sem_close

//my_pxsem_svsem/sem_close.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_close(mysem_t *sem)

5  {

6   if (sem->sem_magic != SEM_MAGIC) {

7    errno = EINVAL;

8    return(-1);

9   }

10  sem->sem_magic = 0; /* Π½Π° всякий случай */

11  free(sem);

12  return(0);

13 }

Ѐункция sem_unlink

Ѐункция sem_unlink, тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 10.40, удаляСт Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ сСмафор System V, связанныС с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π΅ΠΉ сСмафором Posix.

Листинг 10.40. Ѐункция sem_unlink

//my_pxsem_svsem/sem_unlink.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_unlink(const char *pathname)

5  {

6   int semid;

7   key_t key;

8   if ((key = ftok(pathname, 0)) == (key_t) –1)

9    return(-1);

10  if (unlink(pathname) == –1)

11   return(-1);

12  if ((semid = semget(key, 1, SVSEM_MODE)) == –1)

13   return(-1);

14  if (semctl(semid, 0, IPC_RMID) == –1)

15   return(-1);

16  return(0);

17 }

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° System V ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ

8-16 Ѐункция ftok ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° Π² ΠΊΠ»ΡŽΡ‡ System V IPC. ПослС этого Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» удаляСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ unlink (ΠΈΠΌΠ΅Π½Π½ΠΎ Π² этом мСстС ΠΊΠΎΠ΄Π°, Π½Π° Ρ‚ΠΎΡ‚ случай, Ссли ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сСмафор System V Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ semget ΠΈ удаляСм Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ IPC_RMID для semctl.

Ѐункция sem_post

Π’ листингС 10.41 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_post, которая ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора.

11-16 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ semop с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора Π½Π° 1.

Листинг 10.41. Ѐункция sem_post

//my_pxsem_svsem/sem_post.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_post(mysem_t *sem)

5  {

6   struct sembuf op;

7   if (sem->sem_magic != SEM_MAGIC) {

8    errno * EINVAL;

9    return(-1);

10  }

11  op.sem_num = 0;

12  op.sem_op = 1;

13  op.sem_flg = 0;

14  if (semop(sem->sem_semid, &op, 1) < 0)

15   return(-1);

16  return(0);

17 }

Ѐункция sem_wait

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 10.42; ΠΎΠ½Π° называСтся sem_wait ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ измСнСния значСния сСмафора с Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π½Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅, послС Ρ‡Π΅Π³ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора Π½Π° 1.

11-16 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ semop с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‰Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора Π½Π° 1.

Листинг 10.42. Ѐункция sem_wait

//my_pxsem_svsem/sem_wait.c

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_wait(mysem_t *sem)

5  {

6   struct sembuf op;

7   if (sem->sem_magic != SEM_MAGIC) {

8    errno = EINVAL;

9    return(-1);

10  }

11  op.sem_num = 0;

12  op.sem_op = –1;

13  op.sem_flg = 0;

14  if (semop(sem->sem_semid, &op, 1) < 0)

15   return(-1);

16  return(0);

17 }

Ѐункция sem_trywait

Π’ листингС 10.43 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_trywait, которая прСдставляСт собой Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ sem_wait.

13 ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_wait ΠΈΠ· листинга 10.42 Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„Π»Π°Π³Ρƒ sem_flg присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ IPC_NOWAIT. Если опСрация Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π±Π΅Π· блокирования Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, функция semop Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ EAGAIN, Π° это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ sem_trywait, Ссли опСрация Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π±Π΅Π· блокирования ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Листинг 10.43. Ѐункция sem_trywait

//my_pxsem_svsem/sem_trywait.c

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_trywait(mysem_t *sem)

5  {

6   struct sembuf op;

7   if (sem->sem_magic != SEM_MAGIC) {

8    errno = EINVAL;

9    return(-1);

10  }

11  op.sem_num = 0;

12  op.sem_op = –1;

13  op.sem_flg = IPC_NOWAIT;

14  if (semop(sem->sem_semid, &op, 1) < 0)

15   return(-1);

16  return(0);

17 }

Ѐункция sem_getvalue

ПослСдняя функция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 10.44. Π­Ρ‚ΠΎ функция sem_getvalue, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора.

11-14 Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора получаСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ GETVAL Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ semctl.

Листинг 10.44. Ѐункция sem_getvalue

//my_pxsem_svsem/sem_getvalue.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_getvalue(mysem_t *sem, int *pvalue)

5  {

6   int val;

7   if (sem->sem_magic != SEM_MAGIC) {

8    errno = EINVAL;

9    return(-1);

10  }

11  if ((val = semctl(sem->sem_semid, 0, GETVAL)) < 0)

12   return(-1);

13  *pvalue = val;

14  return(0);

15 }

10.17. РСзюмС

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ Posix ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой сСмафоры-счСтчики, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚Ρ€ΠΈ основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСмафора.

2. ΠžΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ измСнСния значСния сСмафора Π½Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ значСния.

3. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ значСния сСмафора Π½Π° 1 ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ выполнСния всСх процСссов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ измСнСния.

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