11.6. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² System V ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ my_lock ΠΈ my_unlock ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 10.10. ΠΠΎΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.6.
ΠΠΈΡΡΠΈΠ½Π³ 11.6. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² System V//lock/locksvsem.c
1 #include "unpipc.h"
2 #define LOCK_PATH "/tmp/svsemlock"
3 #define MAX_TRIES 10
4 int semid, initflag;
5 struct sembuf postop, waitop;
6 void
7 my_lock (int fd)
8 {
9 int oflag, i;
10 union semun arg;
11 struct semid_ds seminfo;
12 if (initflag == 0) {
13 oflag = IPC_CREAT | IPC_EXCL | SVSEM_MODE;
14 if ((semid = semget(Ftok(LOCK_PATH, 0), 1, oflag)) >= 0) {
15 /* ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π» ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ²ΡΠΌ, ΠΎΠ½ ΠΆΠ΅ Π΅Π³ΠΎ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ */
16 arg.val = 1;
17 Semctl(semid, 0, SETVAL, arg);
18 } else if (errno == EEXIST) {
19 /* ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠΎΠ·Π΄Π°Π½ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, ΡΠ±Π΅Π΄ΠΈΠΌΡΡ, ΡΡΠΎ ΠΎΠ½ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ */
20 semid = Semget(Ftok(LOCK_PATH, 0), 1, SVSEM_MODE);
21 arg.buf = &seminfo;
22 for (i = 0; i < MAX_TRIES; i++) {
23 Semctl(semid, 0, IPC_STAT, arg);
24 if (arg.buf->sem_otime != 0)
25 goto init;
26 sleep(1);
27 }
28 err_quit("semget OK, but semaphore not initialized");
29 } else
30 err_sys("semget error");
31 init:
32 initflag = 1;
33 postop.sem_num = 0; /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π΄Π²Π΅ ΡΡΡΡΠΊΡΡΡΡ semop()*/
34 postop.sem_op = 1;
35 postop.sem_flg = SEM_UNDO;
36 waitop.sem_num = 0;
37 waitop.sem_op = β1;
38 waitop.sem_flg = SEM_UNDO;
39 }
40 Semop(semid, &waitop, 1); /* ΡΠΌΠ΅Π½ΡΡΠΈΠΌ Π½Π° 1 */
41 }
42 void
43 my_unlock(int fd)
44 {
45 Semop(semid, &postop, 1); /* ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ Π½Π° 1*/
46 }
ΠΠΎΠΏΡΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ13-17 ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ semget ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ΠΈ IPC_CREAT | IPC_EXCL. ΠΡΠ»ΠΈ ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΡΠΌ, ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ semctl Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 1. ΠΡΠ»ΠΈ ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π²ΡΠ΅ ΠΎΠ½ΠΈ Π²ΡΠ·ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ my_lock, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ (ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ½ Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ) ΠΈ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ.
Π‘Π΅ΠΌΠ°ΡΠΎΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΌΡ Π΅Π³ΠΎ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ18-20 ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ Π²ΡΠ·ΠΎΠ² semget Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ EEXIST, ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ semget Π΅ΡΠ΅ ΡΠ°Π·, Π½ΠΎ ΡΠΆΠ΅ Π±Π΅Π· ΡΠ»Π°Π³ΠΎΠ² IPC_CREAT ΠΈ IPC_EXCL.
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°21-28 Π ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΡΠΈΡΡΠ°ΡΠΈΡ Π³ΠΎΠ½ΠΎΠΊ, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠ°ΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 11.2, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎΠ± ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² System V Π²ΠΎΠΎΠ±ΡΠ΅. ΠΠ»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½, Π²ΡΠ·ΡΠ²Π°ΡΡ semctl Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ IPC_STAT, ΠΏΡΠΎΠ²Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ sem_otime Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°. ΠΠΎΠ³Π΄Π° ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π²ΡΠΈΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π» Π΅Π³ΠΎ ΠΈ Π²ΡΠ·Π²Π°Π» semop (ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ) ΡΡΠΏΠ΅ΡΠ½ΠΎ. ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ (ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠ΅Π΄ΠΊΠΎ), ΠΌΡ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π° ΠΎΠ΄Π½Ρ ΡΠ΅ΠΊΡΠ½Π΄Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ sleep, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌ ΠΏΠΎΠΏΡΡΠΊΡ. Π§ΠΈΡΠ»ΠΎ ΠΏΠΎΠΏΡΡΠΎΠΊ ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ Β«Π·Π°ΡΠ½ΡΠ»Β» Π½Π°Π²ΡΠ΅Π³Π΄Π°.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΡΠΊΡΡΡ sembuf33-38 ΠΠ°ΠΊ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅, ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ sembuf Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π΅ Π½Π΅Π»ΡΠ·Ρ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ Π΄Π²Π΅ ΡΠ°ΠΊΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΡ ΠΏΠΎΠ»ΡΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ my_lock Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ SEM_UNDO, ΡΡΠΎΠ±Ρ ΡΠ΄ΡΠΎ ΡΠ½ΡΠ»ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ, Π½Π΅ ΡΠ½ΡΠ² Π΅Π΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ (ΡΠΌ. ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 10.3).
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ (Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΡΡΠ°ΡΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ), Π½ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. Π ΡΠ»ΡΡΠ°Π΅ Π΄Π΅ΠΌΠΎΠ½Π° ΠΏΠ΅ΡΠ°ΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ Π΄Π»Ρ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΏΠ΅ΡΠ°ΡΠΈ, ΡΠ΄Π°Π»ΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠΎ Π² Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π»ΡΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ, ΡΠ΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ.
11.7. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² System V
ΠΠ° ΡΠ΅ΠΌΠ°ΡΠΎΡΡ System V Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΡΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π±ΡΠ»ΠΈ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ System V (ΡΠ°Π·Π΄Π΅Π» 3.8). ΠΠ½ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π² ΡΠ°Π±Π». 11.1. ΠΠ΅ΡΠ²Π°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠ΅ Π΄Π»Ρ System V ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ΄ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠ°Π½ΠΈΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ oΠ³ΡaΠ½ΠΈΡeΠ½ΠΈe.
Π’Π°Π±Π»ΠΈΡΠ° 11.1. Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² System V
ΠΠΌΡ ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ DUnix 4.0B Solaris 2.6 semmni ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π°Π±ΠΎΡΠΎΠ² ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ 16 10 semmsl ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² Π½Π°Π±ΠΎΡΠ΅ 25 25 semmns ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ 400 60 semopm ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π° ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² semop 10 10 semmnu ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΡΠΊΡΡΡ undo Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ 30 semume ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΡΡΡΠΊΡΡΡΠ΅ undo 10 10 semvmx ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° 32767 32767 semaem ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ 16384 16384Π Digital Unix 4.0B Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° semmnu Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
ΠΡΠΈΠΌΠ΅Ρ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.7 ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π² ΡΠ°Π±Π». 11.1.
ΠΠΈΡΡΠΈΠ½Π³ 11.7. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ΅ΠΌΠ°ΡΠΎΡΡ System V//svsem/limits.c
1 #include "unpipc.h"
2 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ, Π²ΡΡΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ */
3 #define MAX_NIDS 4096 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² */
4 #define MAX_VALUE 1024*1024 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° */
5 #define MAX_MEMBERS 4096 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² Π½Π°Π±ΠΎΡΠ΅ */
6 #define MAX_NOPS 4096 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π° Π²ΡΠ·ΠΎΠ² semop */
7 #define MAX_NPROC Sysconf(_SC_CHILD_MAX)
8 int
9 main(int argc, char **argv)
10 {
11 int i, j, semid, sid[MAX_NIDS], pipefd[2];
12 int semmni, semvmx, semmsl, semmns, semopn, semaem, semume, semmnu;
13 pid_t *child;
14 union semun arg;
15 struct sembuf ops[MAX_NOPS];
16 /* ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°Π±ΠΎΡΠΎΠ² Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ? */
17 for (i = 0; i <= MAX_NIDS; i++) {
18 sid[i] = semget(IPC_PRIVATE, 1, SVSEM_MODE | IPC_CREAT);
19 if (sid[i] == β1) {
20 semmni = i;
21 printf("%d identifiers open at once\n", semmni);
22 break;
23 }
24 }
25 /* ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ sid[0] */
26 for (j = 7; j < MAX_VALUE; j += 8) {
27 arg.val = j;
28 if (semctl(sid[0], 0, SETVAL, arg) == β1) {
29 semvmx = j β 8;
30 printf("max semaphore value = %d\n", semvmx);
31 break;
32 }
33 }
34 for (j = 0; j < i; j++)
35 Semctl(sid[j], 0, IPC_RMID);
36 /* ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² Π½Π°Π±ΠΎΡΠ΅ */
37 for (i = 1; i <= MAX_MEMBERS; i++) {
38 semid = semget(IPC_PRIVATE, i, SVSEM_MODE | IPC_CREAT);
39 if (semid == β1) {
40 semmsl = i-1;
41 printf("max of %d members per set\n", semmsl);
42 break;
43 }
44 Semctl(semid, 0, IPC_RMID);
45 }
46 /* ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ? */
47 semmns = 0;
48 for (i = 0; i < semmni; i++) {
49 sid[i] = semget(IPC_PRIVATE, semmsl, SVSEM_MODE | IPC_CREAT);
50 if (sid[i] == β1) {