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

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

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

38-42 Если ΠΌΡ‹ создали сСмафор, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, записав Π² ΠΊΠ°Π½Π°Π» FIFO value Π±Π°ΠΉΡ‚ΠΎΠ². Если ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ value ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ PIPE_BUF, Π²Ρ‹Π·ΠΎΠ² write послС пСрСполнСния FIFO Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ с ΠΊΠΎΠ΄ΠΎΠΌ EAGAIN.

Ѐункция sem_close

ВСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_close ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 10.23.

11-15 ΠœΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ±Π° дСскриптора ΠΈ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄ Ρ‚ΠΈΠΏ sem_t.

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

//my_pxsem_fifo/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  if (close(sem->sem_fd[0]) == –1 || close(sem->sem_fd[1]) == –1) {

12   free(sem);

13   return(-1);

14  }

15  free(sem);

16  return(0);

17 }

Ѐункция sem_unlink

Ѐункция sem_unlink, тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 10.24, удаляСт ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы наш сСмафор. Она просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ unlink.

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

//my_pxsem_fifo/sem_unlink. с

1 #include "unpipc.h"

2 #include "semaphore.h"


3 int

4 mysem_unlink(const char *pathname)

5 {

6  return(unlink(pathname));

7 }

Ѐункция sem_post

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

11-12 ΠœΡ‹ записываСм ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ Π² FIFO. Если ΠΊΠ°Π½Π°Π» Π±Ρ‹Π» пуст, это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ возобновлСнию выполнСния всСх процСссов, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π²Ρ‹Π·ΠΎΠ²Π΅ read для этого ΠΊΠ°Π½Π°Π»Π°.

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

//my_pxsem_fifo/sem_post.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_post(mysem_t *sem)

5  {

6   char c;

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

8    errno = EINVAL;

9    return(-1);

10  }

11  if (write(sem->sem_fd[1], &c, 1) == 1)

12   return(0);

13  return(-1);

14 }

Ѐункция sem_wait

ПослСдняя функция для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ сСмафорами Posix β€” sem_wait. Π•Π΅ тСкст ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 10.26.

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

//my_pxsem_fifo/sem_wait.с

1  #include "unpipc.h"

2  #include "semaphore.h"


3  int

4  mysem_wait(mysem_t *sem)

5  {

6   char c;

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

8    errno = EINVAL;

9    return(-1);

10  }

11  if (read(sem->sem_fd[0], &c, 1) == 1)

12   return(0);

13  return(-1);

14 } 

11-12 ΠœΡ‹ считываСм 1 Π±Π°ΠΉΡ‚ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° FIFO, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π° приостанавливаСтся, Ссли ΠΊΠ°Π½Π°Π» пуст.

ΠœΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sem_trywait, Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, установив Ρ„Π»Π°Π³ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для ΠΊΠ°Π½Π°Π»Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² read. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sem_getvalue. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСализациях ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ stat ΠΈΠ»ΠΈ fstat возвращаСтся количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ½ΠΎ помСщаСтся Π² ΠΏΠΎΠ»Π΅ st_size структуры stat. Однако это Π½Π΅ гарантируСтся стандартом Posix ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСмафорами Posix ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

10.15. РСализация с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ отобраТСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сСмафоров Posix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ² вмСстС со Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ ΠΈ условными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Posix. РСализация, аналогичная Π΄Π°Π½Π½ΠΎΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π’.11.3 Обоснования стандарта IEEE 1996 [8].

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

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ описаны Π² Π³Π»Π°Π²Π°Ρ… 12 ΠΈ 13. Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ послС прочтСния этих Π³Π»Π°Π². 

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ тСкст нашСго Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° semaphore.h (листинг 10.27), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ опрСдСляСтся Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ sem_t.

Π’ΠΈΠΏ sem_t

1-7 Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… сСмафора содСрТит Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора. Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² связи с листингом 10.21, ΠΏΠΎΠ»Π΅ sem_magiс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SEM_MAGIC ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ структуры.

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

//my_pxsem_mmap/semaphore.h

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

2  typedef struct {

3   pthread_mutex_t sem_mutex; /* блокируСтся ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ значСния сСмафора */

4   pthread_cond_t sem_cond; /* ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния */

5   unsigned int sem_count; /* Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора */

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

7  } mysem_t;


8  #define SEM_MAGIC 0x67458923


9  #ifdef SEM_FAILED

10 #undef SEM_FAILED

11 #define SEM_FAILED ((mysem_t *)(-1)) /* Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ компилятора */

12 #endif

Ѐункция sem_open

Π’ листингС 10.28 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΠ΅Ρ€Π²ΠΎΠΉ части Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_open, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ сСмафора ΠΈΠ»ΠΈ открытия ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ.

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

//my_pxsem_mmap/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 fd, i, created, save_errno;

9   mode_t mode;

10  va_list ap;

11  mysem_t *sem, seminit;

12  struct stat statbuff;

13  unsigned int value;

14  pthread_mutexattr_t mattr;

15  pthread_condattr_t cattr;

16  created = 0;

17  sem = MAP_FAILED; /* [sic] */

18 again:

19  if (oflag & O_CREAT) {

20   va_start(ap, oflag); /* Π°Ρ€ инициализируСтся послСдним явно ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ */

21   mode = va_arg(ap, va_mode_t) & ~S_IXUSR;

22   value = va_arg(ap, unsigned int);

23   va_end(ap);

24   /* ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ„Π»Π°Π³Π° O_EXCL ΠΈ установкой Π±ΠΈΡ‚Π° user-execute */

25   fd = open(pathname, oflag | O_EXCL | O_RDWR, mode | S_IXUSR);

26   if (fd < 0) {

27    if (errno == EEXIST && (oflag & O_EXCL) == 0)

28     goto exists; /* ΡƒΠΆΠ΅ сущСствуСт. OK */

29    else

30     return(SEM_FAILED);

31   }

32   created = 1;

33   /* ΠΊΡ‚ΠΎ создаСт Ρ„Π°ΠΉΠ», Ρ‚ΠΎΡ‚ Π΅Π³ΠΎ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ */

34   /* установка Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° */

35   bzero(&seminit, sizeof(seminit));

36   if (write(fd, &seminit, sizeof(seminit)) != sizeof(seminit))

37    goto err;

38   /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ */

39   sem = mmap(NULL, sizeof(mysem_t), PROT_READ | PROT_WRITE,

40    MAP_SHARED, fd, 0);

41   if (sem == MAP_FAILED)

42    goto err;

43   /* инициализация Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, значСния сСмафора */

44   if ((i = pthread_mutexattr_init(&mattr)) != 0)

45    goto pthreaderr;

46   pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);

47   i = pthread_mutex_init(&sem->sem_mutex, &mattr);

48   pthread_mutexattr_destroy(&mattr); /* Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ */

49   if (i != 0)

50    goto pthreaderr;

51   if ((i = pthread_condattr_init(&cattr)) != 0)

52    goto pthreaderr;

53   pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);

54   i = pthread_cond_init(&sem->sem_cond, &cattr);

55   pthread_condattr_destroy(&cattr); /* Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ */

56   if (i != 0)

57    goto pthreaderr;

58   if ((sem->sem_count = value) > sysconf(_SC_SEM_VALUE_MAX)) {

59    errno = EINVAL;

60    goto err;

61   }

62   /* инициализация Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, снимаСм Π±ΠΈΡ‚ user-execute */

63   if (fchmod(fd, mode) == –1)

64    goto err;

65   close(fd);

66   sem->sem_magic = SEM_MAGIC;

67   return(sem);

68  }

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

19-23 Если ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ O_CREAT, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Π½Π΅ Π΄Π²Π°. Π Π°Π±ΠΎΡ‚Π° со списком Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° va_mode_t ΡƒΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ Π² связи с листингом 5.17, Π³Π΄Π΅ ΠΌΡ‹ использовали ΠΌΠ΅Ρ‚ΠΎΠ΄, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΌΡƒ здСсь. ΠœΡ‹ сбрасываСм Π±ΠΈΡ‚ user-execute ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode (S_IXUSR) ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вскорС Π±ΡƒΠ΄ΡƒΡ‚ раскрыты. БоздаСтся Ρ„Π°ΠΉΠ» с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΈ для Π½Π΅Π³ΠΎ устанавливаСтся Π±ΠΈΡ‚ user-execute.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сСмафора ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ситуации Π³ΠΎΠ½ΠΎΠΊ

24-32 Если Π±Ρ‹ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Ρ„Π»Π°Π³Π° O_CREAT ΠΌΡ‹ просто ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈ Ρ„Π°ΠΉΠ», ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΅Π³ΠΎ содСрТимоС ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ поля структуры sem_t, Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π±Ρ‹ ситуация Π³ΠΎΠ½ΠΎΠΊ. Π­Ρ‚Π° ситуация Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ Π² связи с листингом 5.17, ΠΈ Ρ‚Π°ΠΌ ΠΌΡ‹ воспользовались Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ сСйчас. Вакая ΠΆΠ΅ ситуация Π³ΠΎΠ½ΠΎΠΊ встрСтится Π½Π°ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с листингом 10.37.