Π§ΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ sem_open, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΈΠΏ sem_t, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ fork? Π ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ fork Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ Posix.1 Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ Β«Π²ΡΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Π±ΡΠ΄ΡΡ ΠΎΡΠΊΡΡΡΡ ΠΈ Π² Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅Β». ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½ΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π²Π΅ΡΠ΅Π½:
sem_t *mutex; /* Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌΡΠΉ, ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ fork() */
β¦
/* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ */
mutex = Sem_open(Px_ipc_name(NAME), O_CREAT | O_EXCL, FILE_MODE, 0);
if ((childpid = Fork()) == 0) {
/* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
β¦
Sem_wait(mutex);
β¦
}
/* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
β¦
Sem_post(mutex);
β¦
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² ΠΏΡΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΈΠΏΠ° sem_t, Π½ΠΎ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΈ Π΄ΡΡΠ³Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²). Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ System V ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΈΡ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ semget. ΠΡΠ±ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ. ΠΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ΅ System V Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠ΄ΡΠ΅, Π° ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΡΠ΄ΡΡ.
10.13. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ΅ΠΌΠ°ΡΠΎΡΡ
Π‘ΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ Posix ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π΄Π²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ΅ΠΌΠ°ΡΠΎΡΡ:
β SEM_NSEMS_MAX β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΊΡΡΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° (Posix ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 256);
β SEM_VALUE_MAX β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° (Posix ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ 32767).
ΠΠ²Π΅ ΡΡΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <unistd.h> ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ sysconf, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½ΠΈΠΆΠ΅.
ΠΡΠΈΠΌΠ΅Ρ: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° semsysconf
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.20 Π²ΡΠ·ΡΠ²Π°Π΅Ρ sysconf ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΈΡΡΠΈΠ½Π³ 10.20. ΠΡΠ·ΠΎΠ² sysconf Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ΅ΠΌΠ°ΡΠΎΡΡ//pxsem/semsysconf.Ρ
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 printf("SEM_NSEMS_MAX = %ld, SEM_VALUE_MAX = %ld\n",
6 Sysconf(_SC_SEM_NSEMS_MAX), Sysconf(_SC_SEM_VALUE_MAX));
7 exit(0);
8 }
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Π½Π°ΡΠΈΡ Π΄Π²ΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
solaris % semsysconf
SEMS_NSEMS_MAX = 2147483647, SEM_VALUE_MAX = 2147483647
alpha % semsysconf
SEMS_NSEMS_MAX = 256, SEM_VALUE_MAX = 32767
10.14. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ FIFO
ΠΠ°ΠΉΠΌΠ΅ΠΌΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Posix Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² FIFO. ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π» FIFO Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠΠ΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² Π² ΠΊΠ°Π½Π°Π»Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ sem_post ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ 1 Π±Π°ΠΉΡ Π² ΠΊΠ°Π½Π°Π», a sem_wait ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΠΎΡΡΡΠ΄Π° (ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π΅ΡΠ»ΠΈ ΠΊΠ°Π½Π°Π» ΠΏΡΡΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΈ Ρ ΠΎΡΠΈΠΌ). Π€ΡΠ½ΠΊΡΠΈΡ sem_open ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠ°Π½Π°Π» FIFO, Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½ ΡΠ»Π°Π³ O_CREAT; ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π΄Π²Π°ΠΆΠ΄Ρ (ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π½Π° Π·Π°ΠΏΠΈΡΡ, Π΄ΡΡΠ³ΠΎΠΉ β Π½Π° ΡΡΠ΅Π½ΠΈΠ΅) ΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° FIFO ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² Π½Π΅Π³ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ², ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠΎΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π», ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ.
ΠΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΡΠ΅ΠΊΡΡ Π½Π°ΡΠ΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° semaphore.h, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅Π³ΠΎ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ sem_t (Π»ΠΈΡΡΠΈΠ½Π³ 10.21).
ΠΠΈΡΡΠΈΠ½Π³ 10.21. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» semaphore.h//my_pxsem_fifo/semaphore.h
1 /* ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ */
2 typedef struct {
3 int sem_fd[2]; /* Π΄Π²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° fd: [0] Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, [1] Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ */
4 int sem_magic; /* ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΈΡΠ»ΠΎ */
5 } mysem_t;
6 #define SEM_MAGIC 0x89674523
7 #ifdef SEM_FAILED
8 #undef SEM_FAILED
9 #define SEM_FAILED ((mysem_t *)(-1)) /* ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π²ΡΠ΄Π°Π²Π°Π» ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ*/
10 #endif
Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ sem_t1-5 ΠΠΎΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· FIFO, Π° Π΄ΡΡΠ³ΠΎΠΉ β Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ. ΠΠ»Ρ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΡ ΠΌΡ Ρ ΡΠ°Π½ΠΈΠΌ ΠΎΠ±Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΈΠ· Π΄Π²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΠΊΡΡΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅, Π° Π²ΡΠΎΡΠΎΠΉ β Π½Π° Π·Π°ΠΏΠΈΡΡ.
ΠΠΎΠ»Π΅ sem_magiΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ SEM_MAGIC, Π΅ΡΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°. ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΈΠΏ sem_t, ΡΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π±ΡΠ» Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΡΠΊΡΡΡΡ, Π° Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΡΡΠΎΠΌΡ ΠΏΠΎΠ»Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Ρ ΠΎΡΡ ΠΈ Π½Π΅ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π΅Π½, Π½ΠΎ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ.
Π€ΡΠ½ΠΊΡΠΈΡ sem_open
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.22 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ sem_open, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΈΠ»ΠΈ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ.
ΠΠΈΡΡΠΈΠ½Π³ 10.22. Π€ΡΠ½ΠΊΡΠΈΡ sem_open//my_pxsem_fifo/sem_open.Ρ
1 #include "unpipc.h"
2 #include "semaphore.h"
3 #include <stdarg.h> /* Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² */
4 mysem_t *
5 mysem_open(const char *pathname, int oflag, β¦)
6 {
7 int i, flags, save_errno;
8 char c;
9 mode_t mode;
10 va_list ap;
11 mysem_t *sem;
12 unsigned int value;
13 if (oflag & O_CREAT) {
14 va_start(ap, oflag); /* Π°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ */
15 mode = va_arg(ap, va_mode_t);
16 value = va_arg(ap, unsigned int);
17 va_end(ap);
18 if (mkfifo(pathname, mode) < 0) {
19 if (errno == EEXIST && (oflag & O_EXCL) == 0)
20 oflag &= ~O_CREAT; /* ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, OK */
21 else
22 return(SEM_FAILED);
23 }
24 }
25 if ((sem = malloc(sizeof(mysem_t))) == NULL)
26 return(SEM_FAILED);
27 sem->sem_fd[0] = sem->sem_fd[1] = β1;
28 if ((sem->sem_fd[0] = open(pathname, O_RDONLY | O_NONBLOCK)) < 0)
29 goto error;
30 if ((sem->sem_fd[1] = open(pathname, O_WRONLY | O_NONBLOCK)) < 0)
31 goto error;
32 /* ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° Π΄Π»Ρ sem_fd[0] */
33 if ((flags = fcntl(sem->sem_fd[0], F_GETFL, 0)) < 0)
34 goto error;
35 flags &= ~O_NONBLOCK;
36 if (fcntl(sem->sem_fd[0], F_SETFL, flags) < 0)
37 goto error;
38 if (oflag & O_CREAT) { /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° */
39 for (i = 0; i < value; i++)
40 if (write(sem->sem_fd[1], &c, 1) != 1)
41 goto error;
42 }
43 sem->sem_magic = SEM_MAGIC;
44 return(sem);
45 error:
46 save_errno = errno;
47 if (oflag & O_CREAT)
48 unlink(pathname); /* Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ FIFO */
49 close(sem->sem_fd[0]); /* ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ */
50 close(sem->sem_fd[1]); /* ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ */
51 free(sem);
52 errno = save_errno;
53 return(SEM_FAILED);
54 }
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ sΡΠ΅ΠΌΠ°ΡΠΎΡΠ°13-17 ΠΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΠΊΠ°Π·Π°Π½ ΡΠ»Π°Π³ O_CREAT, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΎ ΡΠ΅ΡΡΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°, Π° Π½Π΅ Π΄Π²Π°. ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ va_start, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π°Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (oflag). ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π°Ρ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ va_arg Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². Π Π°Π±ΠΎΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ° va_mode_t ΠΌΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈ Π² ΡΠ²ΡΠ·ΠΈ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 5.17.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° FIFO18-23 Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ°Π½Π°Π» FIFO, ΠΈΠΌΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΊ ΠΌΡ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 4.6, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ EEXIST, Π΅ΡΠ»ΠΈ ΠΊΠ°Π½Π°Π» ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ sem_open ΡΠ»Π°Π³ O_EXCL Π½Π΅ Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½, ΠΌΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ; Π½ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΊΠ°Π½Π°Π», ΡΠ°ΠΊ ΡΡΠΎ ΠΌΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ O_CREAT.
ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΠ΄ ΡΠΈΠΏ sem_t ΠΈ ΠΎΡΠΊΡΡΡΠΈΠ΅ FIFO Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ25-37 ΠΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΡΠΈΠΏΠ° sem_t, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π΄Π²Π°ΠΆΠ΄Ρ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΊΠ°Π½Π°Π» FIFO: ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅, Π° Π΄ΡΡΠ³ΠΎΠΉ β ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Π·Π°ΠΏΠΈΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΡ Π½Π΅ Ρ ΠΎΡΠΈΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ open, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ΠΈ O_NONBLOCK ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ (Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠ°Π±Π». 4.1). ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ O_NONBLOCK ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΠΊΠ°Π½Π°Π»Π° Π½Π° Π·Π°ΠΏΠΈΡΡ, Π½ΠΎ ΡΡΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΎ Π΄Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (Π½Π° ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ PIPE_BUF). ΠΠΎΡΠ»Π΅ ΠΎΡΠΊΡΡΡΠΈΡ ΠΊΠ°Π½Π°Π»Π° ΠΌΡ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΠΆΠΈΠΌ Π΄Π»Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°, ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°38-42 ΠΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ, Π΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, Π·Π°ΠΏΠΈΡΠ°Π² Π² ΠΊΠ°Π½Π°Π» FIFO value Π±Π°ΠΉΡΠΎΠ². ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ value ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ PIPE_BUF, Π²ΡΠ·ΠΎΠ² write ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ FIFO Π²Π΅ΡΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ EAGAIN.