ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.1, ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΠΈΡΡΠΈΠ½Π³ 5.1. (shm.c) ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main() {
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;
/* ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
segment_id =
shmget(IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/* ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
shared_memory = (char*)shmat(segment_id, 0, 0);
printf("shared memory attached at address %p\n",
shared_memory);
/* ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
shmctl(segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf("segment size: %d\n", segment_size);
/* ΠΠ°ΠΏΠΈΡΡ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ. */
sprintf(shared_memory, "Hello, world.");
/* ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
shmdt(shared_memory);
/* ΠΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°, Π½ΠΎ ΠΏΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ! */
shared_memory =
(char*)shmat(segment_id, (void*) 0x5000000, 0);
printf("shared memory reattached at address %p\n",
shared_memory);
/* ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ, Ρ ΡΠ°Π½ΡΡΠ΅ΠΉΡΡ Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ
ΠΏΠ°ΠΌΡΡΠΈ. */
printf("%s\n", shared_memory);
/* ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
shmdt(shared_memory);
/* ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
shmctl(segment_id, IPC_RMID, 0);
return 0;
}
5.1.7. ΠΡΠ»Π°Π΄ΠΊΠ°
ΠΠΎΠΌΠ°Π½Π΄Π° ipcs Π²ΡΠ΄Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°Ρ (Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°Π΄Π°ΡΡ ΡΠ»Π°Π³ -m). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΠΎΠ±ΡΠ°Π΅ΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ, Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ 1627649:
% ipcs -m
-------- Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1627649 user 640 25600 0
ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΠ΅Π³ΠΌΠ΅Π½Ρ Π±ΡΠ» ΠΏΠΎ ΠΎΡΠΈΠ±ΠΊΠ΅ "Π·Π°Π±ΡΡ" ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ipcrm:
% ipcrm shm 1627649
5.1.8. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΡΠ±ΠΎΡΠ°
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π±ΡΡΡΡΠΎΠ΅ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ, Π½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΠΈ (ΡΡΠΎΠ±Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π΅ ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½Π°). Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Linux Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠ»Π°Π³Π° IPC_PRIVATE.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΠ±ΡΠΈΠΌ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠΌ, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ "Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΡΡΡ" ΠΎ Π²ΡΠ±ΠΎΡΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°.
5.2. Π‘Π΅ΠΌΠ°ΡΠΎΡΡ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
ΠΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, ΠΏΡΠΎΡΠ΅ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΡΡΠΈΠ»ΠΈΡ ΠΏΡΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅: Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 4.4.5, "ΠΠ±ΡΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ", ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΎΡΡ ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΡΡΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π Linux ΠΈΠΌΠ΅Π΅ΡΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² (ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°ΠΌΠΈ System V), ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². Π’Π°ΠΊΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Π²ΡΠ΄Π΅Π»ΡΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΡΠ»ΡΡΠ°Π΅Π² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π³ΡΡΠΏΠΏΠ°ΠΌΠΈ. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΠΎΠΏΠΈΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ.
5.2.1. ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²
Π€ΡΠ½ΠΊΡΠΈΠΈ semget() ΠΈ semctl() Π²ΡΠ΄Π΅Π»ΡΡΡ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠΌ shmget() ΠΈ shmctl(). ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ semget() ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΡΡΠΈΠΉ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²; Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² Π³ΡΡΠΏΠΏΠ΅; ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΠ»Π°Π³ΠΈ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ°, ΠΊΠ°ΠΊ Π² ΡΡΠ½ΠΊΡΠΈΠΈ shmget(). Π€ΡΠ½ΠΊΡΠΈΡ semget() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ². ΠΡΠ»ΠΈ Π·Π°Π΄Π°Π½ ΠΊΠ»ΡΡ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΠ΅, Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ Π΅Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²) ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π²Π½ΡΡΡΡΡ Π½ΡΠ»Ρ.
Π‘Π΅ΠΌΠ°ΡΠΎΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π²ΡΠΈΠ΅ Ρ Π½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΈΡΡ. Π§ΡΠΎΠ±Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ ΠΈΡΡΠ΅ΡΠΏΠ°Π»Π° Π»ΠΈΠΌΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ²Π½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ semctl(), ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ, ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π² Π³ΡΡΠΏΠΏΠ΅, ΡΠ»Π°Π³ IPC_RMID ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° union semun (ΠΎΠ½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ). ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ EUID (ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ) ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠΎΠ·Π΄Π°Π²ΡΠ΅Π³ΠΎ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² (Π»ΠΈΠ±ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°ΠΏΡΡΠ΅Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ root). Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ΄Π°Π»ΡΠ΅ΠΌΠ°Ρ Π³ΡΡΠΏΠΏΠ° ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.2 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, Π²ΡΠ΄Π΅Π»ΡΡΡΠΈΠ΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΠΈΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ.
ΠΠΈΡΡΠΈΠ½Π³ 5.2. (sem_all_deall.c) ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
/* Π’ΠΈΠΏ union semun Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. */
union semun {
int val;
struct semid_ds *buf;
unsigned short int* array;
struct seminfo *__buf;
};
/* ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡ,
Π΅ΡΠ»ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ. */
int binary_semaphore_allocation(key_t key, int sem_flags) {
return semget(key, 1, sem_flags);
}
/* ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Ρ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ
Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌ. Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ -1. */
int binary_semaphore_deallocate(int semid) {
union semun ignored_argument;
return semctl(semid, 1, IPC_RMID, ignored_argument}
}
5.2.2. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²
ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° β Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ, Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ semctl(), Π·Π°Π΄Π°Π² Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ°Π²Π½ΡΠΌ Π½ΡΠ»Ρ, Π° ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΠ°Π²Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ΅ SETALL. Π§Π΅ΡΠ²Π΅ΡΡΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ union semun, ΠΏΠΎΠ»Π΅ array ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΌΠ°ΡΡΠΈΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ° unsigned short. ΠΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΈΠ· Π½Π°Π±ΠΎΡΠ°.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.3 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠ°Ρ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ.
ΠΠΈΡΡΠΈΠ½Π³ 5.3. (sem_init.c) ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* Π’ΠΈΠΏ union semun Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. "/
union semun {
int val;
struct semid_ds* buf;
unsigned short int *array;
struct seminfo *__buf;
};
/* ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 1. */
int binary_semaphore_initialize(int semid) {
union semun argument;
unsigned short values(1);
values[0] = 1;
argument.array = values;
return semctl(semid, 0, SETALL, argument);
}
5.2.3. ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² semop() ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΎΠ±Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ². ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΡΠΎ ΠΌΠ°ΡΡΠΈΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ° struct sembuf, Π·Π°Π΄Π°ΡΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π’ΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΡΠΎ Π΄Π»ΠΈΠ½Π° ΠΌΠ°ΡΡΠΈΠ²Π°.
ΠΠΈΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ sembuf.
β sem_num β Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π² Π³ΡΡΠΏΠΏΠ΅.
β sem_op β ΡΠΈΡΠ»ΠΎ, Π·Π°Π΄Π°ΡΡΠ΅Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ.
ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΠΎΠ½ΠΎ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°.
ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΈΡΠ»Π° Π²ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°. ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠΈΠ΅ ΠΊ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π½Π΅ ΡΡΠ°Π½Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌ (Π²ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²).
ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π½Π΅ ΡΡΠ°Π½Π΅Ρ ΡΠ°Π²Π½ΡΠΌ Π½ΡΠ»Ρ.
β sem_flg β ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π°Π³Π°. Π€Π»Π°Π³ IPC_NOWAIT ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠ½ΠΊΡΠΈΡ semop() Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π²ΡΠ΄Π°ΡΠ΅ΠΉ ΠΊΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΡΠ»Π°Π³Π° SEM_UNDO ΠΠ‘ Linux Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΌΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.4 ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°.