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

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

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

9    return(-1);

10  }

11  if ((n = pthread_mutex_lock(&sem->sem_mutex)) != 0) {

12   errno = n;

13   return(-1);

14  }

15  while (sem->sem_count == 0)

16   pthread_cond_wait(&sem->sem_cond, &sem->sem_mutex);

17  sem->sem_count--;

18  pthread_mutex_unlock(&sem->sem_mutex);

19  return(0);

20 }

11-18 ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с сСмафором, Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора 0, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса приостанавливаСтся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ pthread_cond_wait Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ pthread_cond_signal для этого сСмафора, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с 0 Π½Π° 1. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ становится Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° 1 ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Ѐункция sem_trywait

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

11-22 ΠœΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ провСряСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора. Если ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ 1 ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ процСссу ΠΊΠΎΠ΄ 0. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся –1, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno присваиваСтся ΠΊΠΎΠ΄ ошибки EAGAIN.

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

//my_pxsem_nmap/sem_trywait.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_trywait(mysem_t *sem)

5  {

6   int n, rc;

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

8    errno = EINVAL;

9    return(-1);

10  }

11  if ((n = pthread_mutex_lock(&sem->sem_mutex)) != 0) {

12   errno = n;

13   return(-1);

14  }

15  if (sem->sem_count > 0) {

16   sem->sem_count--;

17   rc = 0;

18  } else {

19   rc = –1;

20   errno = EAGAIN;

21  }

22  pthread_mutex_unlock(&sem->sem_mutex);

23  return(rc);

24 }

Ѐункция sem_getvalue

Π’ листингС 10.35 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст послСднСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” sem_getvalue. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора.

11-16 ΠœΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ считываСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора.

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

//my_pxsem_mmap/sem_getvalue.c

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_getvalue(mysem_t *sem, int *pvalue)

5  {

6   int n;

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

8    errno = EINVAL;

9    return(-1);

10  }

11  if ((n = pthread_mutex_lock(&sem->sem_mutex)) != 0) {

12   errno = n;

13   return(-1);

14  }

15  *pvalue = sem->sem_count;

16  pthread_mutex_unlock(&sem->sem_mutex);

17  return(0);

18 }

Из этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ сСмафорами ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ ΠΈ условными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ.

10.16. РСализация с использованиСм сСмафоров System V

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сСмафоров Posix β€” Π½Π° этот Ρ€Π°Π· с использованиСм сСмафоров System V. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСмафоры System V появились Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ сСмафоры Posix, эта рСализация позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ послСдниС Π² систСмах, Π³Π΄Π΅ ΠΈΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ прСдусмотрСна ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ System V описаны Π² Π³Π»Π°Π²Π΅ 11. Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΈ 11 Π³Π»Π°Π²Ρ‹.

НачнСм, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° semaphore.h (листинг 10.36), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… sem_t.

Листинг 10.36. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» semaphore.h

//my_pxsem_svsem/semaphore.h

1  /* Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… */

2  typedef struct {

3   int sem_semid; /* ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСмафора System V */

4   int sem_magic; /* магичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли сСмафор ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ */

5  } mysem_t;


6  #define SEM_MAGIC 0x45678923


7  #ifdef SEM_FAILED

8  #undef SEM_FAILED

9  #define SEM_FAILED ((mysem_t *)(-1)) /* ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ прСдупрСТдСния компилятора */

10 #endif


11 #ifndef SEMVMX

12 #define SEMVMX 32767 /* историчСски слоТившССся максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для сСмафора System V */

13 #endif

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… sem_t

1-5 ΠœΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор Posix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°Π±ΠΎΡ€Π° сСмафоров System V, состоящСго ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… сСмафора содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСмафора System V ΠΈ магичСскоС число (ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅Π΅ΡΡ Π² связи с листингом 10.21).

Ѐункция sem_open

Π’ листингС 10.37 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_open, которая создаСт Π½ΠΎΠ²Ρ‹ΠΉ сСмафор ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ.

Листинг 10.37. Ѐункция sem_open: пСрвая Ρ‡Π°ΡΡ‚ΡŒ

//my_pxsem_svsem/sem_open. с

1  #include "unpipc.h"

2  #include "semaphore.h"

3  #include <stdarg.h> /* для списков Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ */

4  #define MAX_TRIES 10 /* количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ */


5  mysem_t *

6  mysem_open(const char *pathname, int oflag, … )

7  {

8   int i, fd, semflag, semid, save_errno;

9   key_t key;

10  mode_t mode;

11  va_list ap;

12  mysem_t *sem;

13  union semun arg;

14  unsigned int value;

15  struct semid_ds seminfo;

16  struct sembuf initop;

17  /* Ρ€Π΅ΠΆΠΈΠΌ доступа для sem_open() Π±Π΅Π· O_CREAT Π½Π΅ указываСтся; ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π΅ΠΌ */

18  semflag = SVSEM_MODE;

19  semid = –1;

20  if (oflag & O_CREAT) {

21   va_start(ap, oflag); /* ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π°Ρ€ послСдним явно ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ */

22   mode = va_arg(ap, va_mode_t);

23   value = va_arg(ap, unsigned int);

24   va_end(ap);

25   /* ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π² ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСмафор System V */

26   if ((fd = open(pathname, oflag, mode)) == –1)

27    return(SEM_FAILED);

28   close(fd);

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

30    return(SEM_FAILED);

31   semflag = IPC_CREAT | (mode & 0777);

32   if (oflag & O_EXCL)

33    semflag |= IPC_EXCL;

34    /* создаСм сСмафор System V с Ρ„Π»Π°Π³ΠΎΠΌ IPC_EXCL */

35   if ((semid = semget(key, 1, semflag | IPC_EXCD) >= 0) {

36    /* OK, ΠΌΡ‹ успСли ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ, поэтому ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΡƒΠ»Π΅ΠΌ */

37    arg.val = 0;

38    if (semctl(semid, 0, SETVAL, arg) == –1)

39     goto err;

40    /* ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ sem_otime стало Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ */

41    if (value > SEMVMX) {

42     errno = EINVAL;

43     goto err;

44    }

45    initop.sem_num = 0;

46    initop.sem_op = value;

47    initop.sem_flg = 0;

48    if (semop(semid, &initop, 1) == –1)

49     goto err;

50    goto finish;

51   } else if (errno != EEXIST || (semflag & IPC_EXCL) != 0)

52    goto err:

53   /* ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ */

54  }

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сСмафора ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° со списком Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹

20-24 Если Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ процСсс ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π»Π°Π³ O_CREAT, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Π½Π΅ Π΄Π²Π°. Π Π°Π±ΠΎΡ‚Π° со списком Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… va_mode_t ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ Π² связи с листингом 5.17.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΊΠ»ΡŽΡ‡ System V IPC

25-30 БоздаСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ дСлаСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ имя ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ftok для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ сСмафора. АргумСнт oflag, принятый ΠΎΡ‚ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ процСсса, пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт, ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ EEXIST, Ссли Ρ„Π°ΠΉΠ» сущСствуСт ΠΈ ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ O_EXCL. ДСскриптор Ρ„Π°ΠΉΠ»Π° Π·Π°Ρ‚Π΅ΠΌ закрываСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ СдинствСнная Ρ†Π΅Π»ΡŒ создания Ρ„Π°ΠΉΠ»Π° Π±Ρ‹Π»Π° Π² использовании Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ftok, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Π² ΠΊΠ»ΡŽΡ‡ System V IPC (Ρ€Π°Π·Π΄Π΅Π» 3.2).

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° сСмафоров System V с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом

32-33 ΠœΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ константы O_CREAT ΠΈ O_EXCL Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ константы System V IΠ Π‘_Ρ…Ρ…Ρ… ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ semget для создания Π½Π°Π±ΠΎΡ€Π° сСмафоров System V, состоящСго ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта. Π€Π»Π°Π³ IPC_EXCL указываСтся всСгда, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, сущСствовал Π»ΠΈ сСмафор Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π±Ρ‹Π» создан Сю.

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

34-50 Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 11.2 описана Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ сСмафоров System V, Π° Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 11.6 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π³ΠΎΠ½ΠΎΠΊ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт сСмафор (вспомнитС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„Π»Π°Π³ IPC_EXCL), ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SETVAL ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ semctl, Π° Π·Π°Ρ‚Π΅ΠΌ устанавливаСт Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΌ процСссом Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ semop. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ sem_otime сСмафора Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ semget устанавливаСтся Π² 0 ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ semop. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, любой ΠΏΠΎΡ‚ΠΎΠΊ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ сСмафором, Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ sem_otime Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ 0.