33-37 ΠΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ Π² Π½Π΅Π³ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ Π½ΡΠ»ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈΠΌΠ΅Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ 0, Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ write, Π½ΠΎ Π½Π΅ ftruncate, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΡΠΌΠ΅ΡΠ°Π΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 13.3, Posix Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ftruncate ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΎΠ±ΡΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ38-42 Π€Π°ΠΉΠ» ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ mmap. ΠΡΠΎΡ ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΠΏΠ° sem_t, Ρ ΠΎΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ» Π² ΠΏΠ°ΠΌΡΡΡ, ΠΌΡ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ Π½Π΅ΠΌΡ ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ mmap, ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ read ΠΈΠ»ΠΈ write.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΡΠΊΡΡΡΡ sem_t43-57 ΠΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΠΈ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ sem_t: Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ Posix ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΠ΅ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΠΏΡΠ°Π²Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π΅Π³ΠΎ ΠΈΠΌΡ, ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π°ΡΡΠΈΠ±ΡΡ PTHREAD_PROCESS_SHARED. Π§ΡΠΎΠ±Ρ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΡΡΠΎ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π½ΡΠΆΠ½ΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΡΠΈΠ±ΡΡΡ, Π²ΡΠ·Π²Π°Π² pthread_mutexattr_init, Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π°ΡΡΠΈΠ±ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, Π²ΡΠ·Π²Π°Π² pthread_mutexattr_setpshared, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ pthread_mutex_init. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈ Π΄Π»Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π² ΠΊΠΎΡΠΎΡΡΡ Ρ ΡΠ°Π½ΡΡΡΡ Π°ΡΡΠΈΠ±ΡΡΡ, ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°58-61 ΠΠ°ΠΊΠΎΠ½Π΅Ρ ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π² ΡΠ°ΠΉΠ» Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΡ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ sysconf (ΡΠ°Π·Π΄Π΅Π» 10.13).
Π‘Π±ΡΠΎΡ Π±ΠΈΡΠ° user-execute62-67 ΠΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΌΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π±ΠΈΡ user-execute. ΠΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π±ΡΠ» ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ» Π²ΡΠ·ΠΎΠ²ΠΎΠΌ close, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΡΠΆΠ΅ Π±ΡΠ» ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π΅ΡΠΆΠ°ΡΡ Π΅Π³ΠΎ ΠΎΡΠΊΡΡΡΡΠΌ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.29 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ sem_open. ΠΠ΄Π΅ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Π³ΠΎΠ½ΠΎΠΊ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠ°Ρ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΡΠΆΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠ°ΡΡΡ Π² ΡΠ²ΡΠ·ΠΈ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 5.19.
ΠΠΈΡΡΠΈΠ½Π³ 10.29. Π€ΡΠ½ΠΊΡΠΈΡ sem_open: Π²ΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°//my_pxsem_mmap/sem_open.Ρ
69 exists:
70 if ((fd = open(pathname, O_RDWR)) < 0) {
71 if (errno == ENOENT && (oflag & O_CREAT))
72 goto again;
73 goto err;
74 }
75 sem = mmap(NULL, sizeof(mysem_t), PROT_READ | PROT_WRITE,
76 MAP_SHARED, fd, 0);
77 if (sem == MAP_FAILED)
78 goto err;
79 /* ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠΈΠΌΡΡ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π° */
80 for (i = 0; i < MAX TRIES; i++) {
81 if (stat(pathname, &statbuff) == β1) {
82 if (errno == ENOENT && (oflag & O_CREAT)) {
83 close(fd);
84 goto again;
85 }
86 goto err;
87 }
88 if ((statbuff.st_mode & S_IXUSR) == 0) {
89 close(fd);
90 sem->sem_magic = SEM_MAGIC;
91 return(sem);
92 }
93 sleep(1);
94 }
95 errno = ETIMEDOUT;
96 goto err;
97 pthreaderr:
98 errno = i;
99 err:
100 /* Π½Π΅ Π΄Π°Π΅ΠΌ Π²ΡΠ·ΠΎΠ²Π°ΠΌ unlink ΠΈ munmap ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ΄ errno */
101 save_errno = errno;
102 if (created)
103 unlink(pathname);
104 if (sem != MAP_FAILED)
105 munmap(sem, sizeof(mysem_t));
106 close(fd);
107 errno = save_errno;
108 return(SEM_FAILED);
109 }
ΠΡΠΊΡΡΡΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°69-78 ΠΠ΄Π΅ΡΡ ΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ Π½Π°ΡΡ ΡΠ°Π±ΠΎΡΡ, Π΅ΡΠ»ΠΈ Π»ΠΈΠ±ΠΎ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ ΡΠ»Π°Π³ O_CREAT, Π»ΠΈΠ±ΠΎ ΠΎΠ½ ΡΠΊΠ°Π·Π°Π½, Π½ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. Π ΡΠΎΠΌ ΠΈ Π² Π΄ΡΡΠ³ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ. ΠΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ» Π²ΡΠ·ΠΎΠ²ΠΎΠΌ open Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠΌ mmap.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
Π’Π΅ΠΏΠ΅ΡΡ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ Π² Posix.1 ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ Β«ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠΏΠΈΡΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΒ». ΠΡΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ, ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ ΠΎΡΠΊΡΡΡ. ΠΡΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ sem_open Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°), ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ. ΠΡΠ»ΠΈ ΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΡΡΡΠΊΡΡΡΡ sem_t, ΠΎΠ½Π° ΡΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ΅ΠΉ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². Π₯ΠΎΡΡ Π½Π°ΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ (ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ Π½Π΅ Π±ΡΠ΄ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π΄ΠΎ Π²ΡΠ·ΠΎΠ²Π° sem_close, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠΎΠΏΠΈΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°), Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΌΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ Π·Π°ΠΌΠ΅ΡΡΡΠ΅ (ΡΠ°Π±Π». 1.4), ΡΡΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ fork, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΡΠ΄ΡΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ.
Π£Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠΈΠΌΡΡ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½79-96 ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΡΠ΅ΠΌΠ°ΡΠΎΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ (Π΅ΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΡΡΠ°ΡΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ). ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ stat ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π±ΠΈΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠ°ΠΉΠ»Π° (ΠΏΠΎΠ»Π΅ st_mode ΡΡΡΡΠΊΡΡΡΡ stat). ΠΡΠ»ΠΈ Π±ΠΈΡ user-execute ΡΠ½ΡΡ, ΡΡΡΡΠΊΡΡΡΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°.
ΠΠΎΠ·Π²ΡΠ°Ρ ΠΊΠΎΠ΄ΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ97-108 ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ Π½ΡΠΆΠ½ΠΎ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡ Π΅Π΅ ΠΊΠΎΠ΄.
Π€ΡΠ½ΠΊΡΠΈΡ sem_close
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.30 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ sem_close, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ munmap Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΌΡΡΡ ΡΠ°ΠΉΠ»Π°. ΠΡΠ»ΠΈ Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΡΠ°Π½Π΅Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ sem_open, ΠΎΠ½ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠΈΠ³Π½Π°Π» SIGSEGV.
ΠΠΈΡΡΠΈΠ½Π³ 10.30. Π€ΡΠ½ΠΊΡΠΈΡ sem_close//my_pxsem_mmap/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 if (munmap(sem, sizeof(mysem_t)) == β1)
11 return(-1);
12 return(0);
13 }
Π€ΡΠ½ΠΊΡΠΈΡ sem_unlink
Π’Π΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sem_unlink ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.31. ΠΠ½Π° ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ°ΠΉΠ», ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π΄Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ, Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ unlink.
ΠΠΈΡΡΠΈΠ½Π³ 10.31. Π€ΡΠ½ΠΊΡΠΈΡ sem_unlink//my_pxsem_mmap/sem_unlink.Ρ
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_unlink(const char *pathname)
5 {
6 if (unlink(pathname) == β1)
7 return(-1);
8 return(0);
9 }
Π€ΡΠ½ΠΊΡΠΈΡ sem_post
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.32 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sem_post, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ.
ΠΠΈΡΡΠΈΠ½Π³ 10.32. Π€ΡΠ½ΠΊΡΠΈΡ sem_post//my_pxsem_mmap/sem_post.Ρ
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_post(mysem_t *sem)
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 if (sem->sem_count == 0)
16 pthread_cond_signal(&sem->sem_cond);
17 sem->sem_count++;
18 pthread_mutex_unlock(&sem->sem_mutex);
19 return(0);
20 }
11-18 ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ, Π½ΡΠΆΠ½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Ρ 0 Π½Π° 1, Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ pthread_cond_signal, ΡΡΠΎΠ±Ρ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
Π€ΡΠ½ΠΊΡΠΈΡ sem_wait
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.33 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sem_wait, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Ρ 0 Π½Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π΅Π³ΠΎ Π½Π° 1.
ΠΠΈΡΡΠΈΠ½Π³ 10.33. Π€ΡΠ½ΠΊΡΠΈΡ sem_wait//my_pxsem_mmap/sem_wait.Ρ
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_wait(mysem_t *sem)
5 {
6 int n;
7 if (setn->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 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 ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.