ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΡΡ ΡΡ Π΅ΠΌΡ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ (ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ) Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° Π³ΡΡΠΏΠΏΠ° ΠΈΠ· Π΄Π²ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ². ΠΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π΅Π³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡΠΈΠΉ ΡΠΈΠ³Π½Π°Π» β 0, Π° 1 ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΏΡΠ΅ΡΠ°ΡΡΠΈΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ. ΠΡΠΎΡΠΎΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π°ΡΠ°Π» ΡΠ°Π±ΠΎΡΡ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²Π°ΠΌΠΈ: Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΠ΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΠΌΡΡΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌ (0), ΠΈ Π²ΡΠ·ΠΎΠ² ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ·Π²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ
mem_lock#define MAXBUFF 80#define PERM 0666/* Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ
Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ */typedef struct mem_msg {Β int segment;Β char buff[MAXBUFF];} Message;/* ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π½Π°ΡΠ°Π»Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° */static struct sembuf proc_wait[1] = { 1, -1, 0 };/* Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π°ΡΠ°Π» ΡΠ°Π±ΠΎΡΡ */static struct sembuf proc_start[1] = {Β 1, 1, 0};/* ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ */static struct sembuf mem_lock[2] = {Β 0, 0, 0,Β 0, 1, 0};/* ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠ° */static struct sembuf mem_unlock[1] = {Β 0, -1, 0};#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include "shmem.h"main() {Β Message* msgptr;Β key_t key;Β int shmid, semid;Β /* ΠΠΎΠ»ΡΡΠΈΠΌ ΠΊΠ»ΡΡ, ΠΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠ»ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊΒ Β Β Π΄Π»Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ */Β if ((key = ftok("server", 'A')) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ»ΡΡ\n");Β exit(1);Β }Β /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΠ±Π»Π°ΡΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ */Β if ((shmid = shmget(key, sizeof(Message),Β PERM | IPC_CREAT)) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±Π»Π°ΡΡΡ\n");Β exit(1);Β }Β /* ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠΌ Π΅Π΅ */Β if ((msgptr = (Message*)shmat(shmid, 0, 0)) < 0) {Β printf("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ\n");Β exit(1);Β }Β /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³ΡΡΠΏΠΏΡ ΠΈΠ· Π΄Π²ΡΡ
ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²:Β Β Β ΠΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ - Π΄Π»Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡΒ Β Β Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ. ΠΡΠΎΡΠΎΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ -Β Β Β Π΄Π»Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² */Β if ((semid = semget(key, 2, PERM | IPC_CREAT)) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ\n");Β exit(1);Β }Β /* ΠΠ΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π°ΡΠ½Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ */Β if (semop(semid, &proc_wait[0], 1) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ\n");Β exit(1);Β }Β /* ΠΠ΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΡ Π·Π°ΠΏΠΈΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡΒ Β Β ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ Π΅Π΅. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ Π΅Π΅ */Β if (semop(semid, &mem_lock[0], 2) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ\n");Β exit(1);Β }Β /* ΠΡΠ²Π΅Π΄Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π» */Β printf(%s, msgptr->buff);Β /* ΠΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ */Β if (semop(semid, &mem_unlock[0], 1) < 0 {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ\n");Β exit(1);Β }Β /* ΠΡΠΊΠ»ΡΡΠΈΠΌΡΡ ΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ */Β if (shmdt(msgptr) < 0) {Β printf("ΠΡΠΈΠ±ΠΊΠ° ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ\n");Β exit(1);Β }Β /* ΠΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ */Β exit(0);}