#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), 0)) < 0) {Β printf("ΠΡΠΈΠ±ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ°\n");Β exit(1);Β }Β /* ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠΌ Π΅Π΅ */Β if ((msgptr = (Message*)shmat(shmid, 0, 0)) < 0) {Β prinf("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ\n);Β exit(1);Β }Β /* ΠΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ */Β if ((semid = semget(key, 2, PERM)) < 0) {Β printf("ΠΡΠΈΠ±ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ°\n");Β exit(1);Β }Β /* ΠΠ°Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ */Β if (semop(semid, &mem_lock[0], 2) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ\n");Β exit(1);Β }Β /* Π£Π²Π΅Π΄ΠΎΠΌΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΎ Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ */Β if (semop(semid, &proc_start[0], 1) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ\n");Β exit(1);Β }Β /* ΠΠ°ΠΏΠΈΡΠ΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ */Β sprintf(msgptr->buff, "ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉ, ΠΠΈΡ!\n");Β /* ΠΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ */Β if (semop(semid, &mem_unlock[0], 1) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ\n");Β exit(1);Β }Β /* ΠΠ΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΡΠ΅ΡΠ²Π΅Ρ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΒ Β Β ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ */Β if (semop(semid, &mem_lock[0], 2) < 0) {Β printf(ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ\n");Β exit(1);Β }Β /* ΠΡΠΊΠ»ΡΡΠΈΠΌΡΡ ΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ */Β if (shmdt(msgptr) < 0) {Β printf("ΠΡΠΈΠ±ΠΊΠ° ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ\n");Β exit(1);Β }Β /* Π£Π΄Π°Π»ΠΈΠΌ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ IPC */Β if (shmctl(shmid, IPC_RMID, 0) < 0) {Β Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΠ±Π»Π°ΡΡΡ\n");Β exit(1);Β }Β if (semctl(semid, 0, IPC_RMID) < 0) {Β printf("ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ\n");Β exit(1);Β }Β exit(0);}ΠΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π² BSD UNIX. Π‘ΠΎΠΊΠ΅ΡΡ
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ BSD UNIX ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠ²Π°Π»ΠΈΡΡ ΡΡΠ΄ΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ:
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΎ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π»ΠΈ ΠΎΠ½ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ ΠΈΠ»ΠΈ Π½Π° ΡΠ°Π·Π½ΡΡ Ρ ΠΎΡΡΠ°Ρ ΡΠ΅ΡΠΈ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠ΅Π³ΠΎ ΡΡΠΎΠΌΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΈ Π±Π°Π·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ΅ΡΠΈ UNIX. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡ Π΅ΠΌΡ Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΈΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ Ρ.Π΄. Π ΡΡΠΎΠΉ ΡΠ²ΡΠ·ΠΈ Π±ΡΠ»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ ΠΏΠΎΠ½ΡΡΠΈΠ΅ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π΄ΠΎΠΌΠ΅Π½ (communication domain), ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ΅Π΅ Π½Π°Π±ΠΎΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½ΡΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΠ»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ·Π»Π°, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ΅ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΠΏΡΠΎΡΠ΅ΡΡΠ°), Π±ΡΠ» ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ β ΡΠΎΠΊΠ΅Ρ (socket). Π‘ΠΎΠΊΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ»Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. Π‘ΠΎΠΊΠ΅ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΡΡΡΠΏΠ° Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ UNIX, ΠΈ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π°Π΄ΡΠ΅ΡΡΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ β Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΎΠΊΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΠΊΠ° Π½Π° Π½Π΅Π³ΠΎ ΡΡΡΠ»Π°Π΅ΡΡΡ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ Π² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΠ΅. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ ΡΠ²ΡΠ·ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅ (virtual circuit) ΠΈΠ»ΠΈ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌΠ°Ρ (datagram), ΠΏΡΠΈΡΠ΅ΠΌ ΡΡΠΈ ΡΠΈΠΏΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Ρ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΡ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². ΠΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠΎΠ², Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ. ΠΠΎΠ»Π½ΡΠΉ Π½Π°Π±ΠΎΡ ΡΡΠΈΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ:
β‘Β Π£ΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΡ Π΄Π°Π½Π½ΡΡ
β‘Β ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
β‘Β ΠΠ°Π΄Π΅ΠΆΠ½ΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΡ Π΄Π°Π½Π½ΡΡ
β‘Β Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π³ΡΠ°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
β‘Β ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΊΡΡΡΠ΅Π½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
β‘Β ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ