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