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

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

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

МоТно привСсти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΡƒΡŽ схСму ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя процСссами (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром) с использованиСм раздСляСмой памяти. Для синхронизации процСссов использована Π³Ρ€ΡƒΠΏΠΏΠ° ΠΈΠ· Π΄Π²ΡƒΡ… сСмафоров. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сСмафор слуТит для блокирования доступа ΠΊ раздСляСмой памяти, Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠΉ сигнал β€” 0, Π° 1 являСтся Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠΌ сигналом. Π’Ρ‚ΠΎΡ€ΠΎΠΉ сСмафор слуТит для сигнализации сСрвСру ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ примСнСния Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ сСмафора обусловлСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°ΠΌΠΈ: Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС сСмафора, ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (0), ΠΈ Π²Ρ‹Π·ΠΎΠ² сСрвСром ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ памяти для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ

mem_lock
Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. НазначСниС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ сСмафора Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ сСрвСра, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π» Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π½Π°Ρ‡Π°Π» Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ сСрвСром ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ mem_lock Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ приостановлСно Π΄ΠΎ освобоТдСния памяти ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ это послС окончания записи строки "Здравствуй, ΠœΠΈΡ€!".

shmem.h:

#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);

}