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

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

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

Β  exit(1);

Β }

Β /* ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ сообщСниС ("Здравствуй, ΠœΠΈΡ€!") ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ Π΅Π³ΠΎ

Β Β Β  Π½Π° экран */

Β while ((n = read(readfd, buff, MAXBUFF)) > 0)

Β  if {write(1, buff, n) != n) {

Β Β  printf("Ошибка Π²Ρ‹Π²ΠΎΠ΄Π°\n");

Β Β  exit(1);

Β  }

Β /* Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ FIFO, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ FIFO - Π΄Π΅Π»ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° */

Β close(readfd);

Β exit(0);

}

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

#include <sys/types.h>

#include <sys/stat.h>

/* БоглашСниС об имСни FIFO */

#define FIFO "fifo.1"

main() {

Β int writefd, n;

Β /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ доступ ΠΊ FIFO */

Β if ((writefd = open(FIFO, O_WRONLY)) < 0) {

Β  printf("НСвозмоТно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ FIFO\n");

Β  exit(1);

Β }

Β /* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ сообщСниС сСрвСру FIFO */

Β if (write(writefd, "Здравствуй, ΠœΠΈΡ€!\n", 18) != 18) {

  printf("Ошибка записи\n");

Β Β exit(1);

Β }

Β /* Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ FIFO */

Β close(writefd);

Β /* Π£Π΄Π°Π»ΠΈΠΌ FIFO */

Β if (unlink(FIFO) < 0) {

Β  printf("НСвозмоТно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ FIFO\n");

Β  exit(1);

Β }

Β exit(0);

}

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΈΠΌΠ΅Π½Π° Π² IPC

Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, отсутствиС ΠΈΠΌΠ΅Π½ Ρƒ ΠΊΠ°Π½Π°Π»ΠΎΠ² Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… нСдоступными для нСзависимых процСссов. Π­Ρ‚ΠΎΡ‚ нСдостаток устранСн Ρƒ FIFO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π°. Π”Ρ€ΡƒΠ³ΠΈΠ΅ срСдства мСТпроцСссного взаимодСйствия, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ слоТными, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… соглашСний ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° мСТпроцСссного взаимодСйствия называСтся пространством ΠΈΠΌΠ΅Π½ (name space). ИмСна ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ систСмы мСТпроцСссного взаимодСйствия для всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ процСссам ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Π’Π°ΠΊ, ΠΈΠΌΠ΅Π½Π΅ΠΌ FIFO являСтся имя Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ условлСнноС имя созданного FIFO Π΄Π²Π° процСсса ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ этому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Для Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² IPC, ΠΊΠ°ΠΊ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, сСмафоры ΠΈ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ, процСсс назначСния ΠΈΠΌΠ΅Π½ΠΈ являСтся Π±ΠΎΠ»Π΅Π΅ слоТным, Ρ‡Π΅ΠΌ просто ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. Имя для этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² называСтся ΠΊΠ»ΡŽΡ‡ΠΎΠΌ (key) ΠΈ гСнСрируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ftok(3C) ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² β€” ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(char* filename, char proj);

Π’ качСствС

filename
ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, извСстноС Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ процСссам. НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-сСрвСра. Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот Ρ„Π°ΠΉΠ» сущСствовал Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания ΠΊΠ»ΡŽΡ‡Π°. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСтся ΠΈ удаляСтся Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ распрСдСлСнного прилоТСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΠΎΠΌΠ΅Ρ€ inode Ρ„Π°ΠΉΠ»Π°. Π’Π½ΠΎΠ²ΡŒ созданный Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ inode ΠΈ впослСдствии процСсс, ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡.

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ IPC нСродствСнным процСссам. Однако для ссылок Π½Π° ΡƒΠΆΠ΅ созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

КаТдоС ΠΈΠ· пСрСчислСнных IPC ΠΈΠΌΠ΅Π΅Ρ‚ свой ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ дСскриптор (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ОБ (ядром) для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСскриптора обСспСчиваСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ дСскриптора для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, сСмафоры ΠΈ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ), Ρ‚.Π΅. какая-Π»ΠΈΠ±ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ числСнный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎ ΠΈ раздСляСмая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти (хотя Π»ΡŽΠ±Ρ‹Π΅ Π΄Π²Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹).

Π’Π°Π±Π»ΠΈΡ†Π° 3.5. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² IPC

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ IPC ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ ДСскриптор
Канал – Π€Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор
FIFO Имя Ρ„Π°ΠΉΠ»Π° Π€Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор
ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний ΠšΠ»ΡŽΡ‡ Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€
ΠžΠ±ΡŠΠ΅ΠΊΡ‚ IPC ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ ДСскриптор
Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ ΠšΠ»ΡŽΡ‡ Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€
РаздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠšΠ»ΡŽΡ‡ Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

Π Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ IPC System V Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ сходна. Для создания ΠΈΠ»ΠΈ получСния доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ get: msgget(2) для ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, semget(2) для сСмафора ΠΈ shmget(2) для раздСляСмой памяти. ВсС эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ дСскриптор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² случаС успСха ΠΈ -1 Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ процСссу ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎ сущСству являСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ дСскриптор, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСния ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ сСмафор ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠ»ΡŽΡ‡

key
ΠΈ Ρ„Π»Π°ΠΆΠΊΠΈ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
ipcflag
. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ зависят ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ
ipcflag
опрСдСляСт ΠΏΡ€Π°Π²Π° доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ
PERM
, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, создаСтся Π»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ трСбуСтся доступ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ. ПослСднСС опрСдСляСтся ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ (ΠΈΠ»ΠΈ отсутствиСм) Ρ„Π»Π°ΠΆΠΊΠΎΠ²
IPC_CREAT
ΠΈ
IPC_EXCL
.