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_t1-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 IPC25-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.