Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 85

Автор РобачСвский АндрСй ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡

ΠšΠ»ΠΈΠ΅Π½Ρ‚:

#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), ΠΏΡ€ΠΈΡ‡Π΅ΠΌ эти Ρ‚ΠΈΠΏΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ согласованы для всСх ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². ВсС сокСты условно ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° нСсколько Ρ‚ΠΈΠΏΠΎΠ², Π² зависимости ΠΎΡ‚ прСдоставляСмых ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… характСристик. ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ этих характСристик Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚:

β–‘Β Π£ΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…

β–‘Β ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ дублирования Π΄Π°Π½Π½Ρ‹Ρ…

β–‘Β ΠΠ°Π΄Π΅ΠΆΠ½ΡƒΡŽ доставку Π΄Π°Π½Π½Ρ‹Ρ…

β–‘Β Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π³Ρ€Π°Π½ΠΈΡ† сообщСний

β–‘Β ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ экстрСнных сообщСний

β–‘Β ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ установлСниС соСдинСния