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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор Уильям БтивСнс

ГЛАВА 3

System V IPC

3.1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Из ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Ρ‚ΠΈΠΏΠΎΠ² IPC ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСны ΠΊ System V IPC, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ взаимодСйствия процСссов, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ стандарту System V:

β–  ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний System V (Π³Π»Π°Π²Π° 6);

β–  сСмафоры System V (Π³Π»Π°Π²Π° 11);

β–  общая ΠΏΠ°ΠΌΡΡ‚ΡŒ System V (Π³Π»Π°Π²Π° 14).

Π’Π΅Ρ€ΠΌΠΈΠ½ Β«System V IPCΒ» Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ происхоТдСнии этих срСдств: Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΎΠ½ΠΈ появились Π² Unix System V. Π£ Π½ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ: схоТи Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… организуСтся доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ; Ρ‚Π°ΠΊΠΆΠ΅ схоТи Ρ„ΠΎΡ€ΠΌΡ‹ хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ядрС. Π’ этой Π³Π»Π°Π²Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠ΅ для Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ² IPC Ρ‡Π΅Ρ€Ρ‚Ρ‹.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ функциях свСдСна Π² Ρ‚Π°Π±Π». 3.1.


Π’Π°Π±Π»ΠΈΡ†Π° 3.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ System V IPC

ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ ΠžΠ±Ρ‰Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <sys/msg.h> <sys/sem.h> <sys/shm.h> Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ msgget semget shmget ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ управлСния msgctl semctl shmctl ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ IPC msgsnd msgrcv semop shmat shmdt

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎΠ± истории Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ развития Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ System V IPC Π½Π΅ слишком Π»Π΅Π³ΠΊΠΎ доступна. [16] прСдоставляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, сСмафоры ΠΈ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ этого Ρ‚ΠΈΠΏΠ° Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Π² ΠΊΠΎΠ½Ρ†Π΅ 70-Ρ… Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ„ΠΈΠ»ΠΈΠ°Π»ΠΎΠ² Bell Laboratories Π² Π³ΠΎΡ€ΠΎΠ΄Π΅ ΠšΠΎΠ»ΡƒΠΌΠ±ΡƒΡ, ΡˆΡ‚Π°Ρ‚ Огайо, для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· вСрсий Unix, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ использования. ВСрсия эта Π½Π°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ Columbus Unix, ΠΈΠ»ΠΈ CB Unix. Она использовалась Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… систСмах ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ β€” систСмах ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ β€” для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ управлСния ΠΈ вСдСния записСй Π² Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. System V IPC Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΊΠΎΠΌΠΌΠ΅Ρ€Ρ‡Π΅ΡΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Unix System V. ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² 1983 Π³ΠΎΠ΄Ρƒ.

3.2. ΠšΠ»ΡŽΡ‡ΠΈ Ρ‚ΠΈΠΏΠ° key_t ΠΈ функция ftok

Π’ Ρ‚Π°Π±Π». 1.2 Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ² System V IPC использовались значСния key_t. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <sys/types.h> опрСдСляСт Ρ‚ΠΈΠΏ key_t ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ (ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ 32-разрядноС). ЗначСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ этого Ρ‚ΠΈΠΏΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ftok.

Ѐункция ftok ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΈ цСлочислСнный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° key_t (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ IPC β€” IPC key):

#include <sys/ipc.h>

key_t ftok(const char *pathname, int id);

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ IPC Π»ΠΈΠ±ΠΎ –1 ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки

На самом Π΄Π΅Π»Π΅ функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° ΠΈ младшиС 8 Π±ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° для формирования цСлочислСнного ΠΊΠ»ΡŽΡ‡Π° IPC.

Π­Ρ‚Π° функция дСйствуСт Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ IPC, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° IPC, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² контСкстС прилоТСния. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ имя Π΄Π΅ΠΌΠΎΠ½Π° сСрвСра ΠΈΠ»ΠΈ имя Ρ„Π°ΠΉΠ»Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сСрвСром, ΠΈΠ»ΠΈ имя Π΅Ρ‰Π΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Если ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈ сСрвСру для связи трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π» IPC, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1. Если трСбуСтся нСсколько ΠΊΠ°Π½Π°Π»ΠΎΠ² IPC (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚ сСрвСра ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈ ΠΎΠ΄ΠΈΠ½ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ сторону), ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ значСния: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1 ΠΈ 2. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр договорятся ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅, ΠΎΠ½ΠΈ ΠΎΠ±Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ftok для получСния ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° IPC.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ftok Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ stat, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚:

β–  ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ относится ΠΏΠΎΠ»Π½ΠΎΠ΅ имя pathname (ΠΏΠΎΠ»Π΅ st_dev структуры stat);

β–  Π½ΠΎΠΌΠ΅Ρ€ ΡƒΠ·Π»Π° (i-node) Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС (ΠΏΠΎΠ»Π΅ st_ino структуры stat);

β–  младшиС 8 Π±ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ Π½ΡƒΠ»ΡŽ).

Из ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ этих Ρ‚Ρ€Π΅Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ получаСтся 32-разрядный ΠΊΠ»ΡŽΡ‡. НСт Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ для Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ получатся Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ количСство Π±ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ‚Ρ€Π΅Ρ… пСрСчислСнных элСмСнтах (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Π½ΠΎΠΌΠ΅Ρ€ ΡƒΠ·Π»Π°, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ IPC) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ число Π±ΠΈΡ‚ Π² Ρ†Π΅Π»ΠΎΠΌ (см. ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3.5).

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

НомСр ΡƒΠ·Π»Π° всСгда ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ нуля, поэтому Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ константу IPC_PRIVATE (Ρ€Π°Π·Π΄Π΅Π» 3.4) Ρ€Π°Π²Π½ΠΎΠΉ Π½ΡƒΠ»ΡŽ.

Если ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Π½Π΅ сущСствуСт ΠΈΠ»ΠΈ нСдоступно Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ процСссу, ftok Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ –1. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ», имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для вычислСния ΠΊΠ»ΡŽΡ‡Π°, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ сСрвСром Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ создании Π·Π°Π½ΠΎΠ²ΠΎ эти Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΡƒΠ·Π»Π°, Π° это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ftok ΠΏΡ€ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 3.1 ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ stat ΠΈ ftok, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния ΠΏΠΎΠ»Π΅ΠΉ st_dev ΠΈ st_ino структуры stat ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠ»ΡŽΡ‡ IPC. Π­Ρ‚ΠΈ Ρ‚Ρ€ΠΈ значСния выводятся Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, поэтому Π»Π΅Π³ΠΊΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ»ΡŽΡ‡ IPC формируСтся ΠΈΠ· этих Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° 0x57.

Листинг 3.1[1]. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π΅ ΠΈ созданного ΠΊΠ»ΡŽΡ‡Π° IPC

//svipc/ftok.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   struct stat stat;

6   if (argc != 2)

7    err_quit("usage: ftok <pathname>");

8   Stat(argv[1], &stat);

9   printf("st_dev: &lx, st_ino: %Ix, key: %x\n",

10   (u_long) stat.st_dev, (u_long) stat.st_ino,

11   Ftok(argv[1], 0x57));

12  exit(0);

13 }

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² систСмС Solaris 2.6 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ:

solaris %ftok /etc/system

st_dev: 800018, st_ino: 4a1b, key: 57018a1b

solaris %ftok /usr/tmp

st_dev: 800015, st_ino: 10b78, key: 57015b78

solaris %ftok /home/rstevens/Mail.out

st_dev: 80001f, st_ino: 3b03, key: 5702fb03

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ опрСдСляСт ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 8 Π±ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡Π°; младшиС 12 Π±ΠΈΡ‚ st_dev ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 12 Π±ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡Π°, ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ†, младшиС 12 Π±ΠΈΡ‚ st_ino ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ младшиС 12 Π±ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡Π°.

ЦСль этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ впослСдствии Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚Π°ΠΊΠΎΠΉ способ формирования ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ· пСрСчислСнной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… рСализациях Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ FreeBSD ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ младшиС 8 Π±ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, младшиС 8 Π±ΠΈΡ‚ st_dev ΠΈ младшиС 16 Π±ΠΈΡ‚ st_ino.

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ftok, β€” одностороннСС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‡Π°ΡΡ‚ΡŒ Π±ΠΈΡ‚ st_dev ΠΈ st_ino Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. По Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ для вычислСний.

3.3. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ipc_perm

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° IPC, ΠΊΠ°ΠΊ для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² ядрС хранится Π½Π°Π±ΠΎΡ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, объСдинСнной Π² структуру.

struct ipc_perm {

 uid_t uid; /*ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°*/

 gid_t gid; /*ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° */

 uid_t cuid; /*ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ создатСля*/

 gid_t cgid; /*ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ создатСля*/

 mode_t mode; /*Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ чтСния-записи*/

 ulong_t seq; /*ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°*/

 key_t key; /* ΠΊΠ»ΡŽΡ‡ IPC */

}

Π­Ρ‚Π° структура вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ константами для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ System V IPC ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅ <sys/ipc.h>. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ расскаТСм ΠΎ полях структуры ipc_perm Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.


3.4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π½Π°Π»ΠΎΠ² IPC

Π’Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getXXX, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для создания ΠΈΠ»ΠΈ открытия ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² IPC (Ρ‚Π°Π±Π». 3.1), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΊΠ»ΡŽΡ‡ IPC (Ρ‚ΠΈΠΏΠ° key_t) Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ цСлочислСнный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π­Ρ‚ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдавался Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ftok, ΠΊΠ°ΠΊ ΠΌΡ‹ вскорС ΡƒΠ²ΠΈΠ΄ΠΈΠΌ. Π£ прилоТСния Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ возмоТности задания ΠΊΠ»ΡŽΡ‡Π° (ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ getXXX):

1. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ ftok, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΉ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

2. Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ Π² качСствС ΠΊΠ»ΡŽΡ‡Π° константу IPCPRIVATE, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° IPC.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ рис. 3.1. 

Рис. 3.1. ВычислСниС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² IPC ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ


ВсС Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getXXX (Ρ‚Π°Π±Π». 3.1) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π°Π±ΠΎΡ€ Ρ„Π»Π°Π³ΠΎΠ² oflag, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ Π±ΠΈΡ‚Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ чтСния-записи (ΠΏΠΎΠ»Π΅ mode структуры ipc_perm) для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° IPC ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ, создаСтся Π»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ IPC ΠΈΠ»ΠΈ производится ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ. Для этого ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°.