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_t79-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 ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΈΠ»ΠΈ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ (ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠΌΠΈ Π² ΠΏΠ°ΠΌΡΡΠΈ). ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠΈ ΡΠΈΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π° ΠΏΠΎ ΠΆΠΈΠ²ΡΡΠ΅ΡΡΠΈ: ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΠΏΠΎ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΆΠΈΠ²ΡΡΠ΅ΡΡΡΡ ΡΠ΄ΡΠ°, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΠΆΠΈΠ²ΡΡΠ΅ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°.