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

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

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

#include <sys/msg.h>

int msgget(key_t key, int msgflag);

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π»ΠΈΠ±ΠΎ -1 Π² случаС ошибки. Подобно Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΌΡƒ дСскриптору, этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ процСссом для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ сообщСний. Π’ частности, процСсс ΠΌΠΎΠΆΠ΅Ρ‚:

β–‘Β ΠŸΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ msgsnd(2);

β–‘Β ΠŸΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ msgrcv(2);

β–‘Β Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСниями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ msgctl(2).

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ манипулирования сообщСниями ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgsnd(int msqid, const void *msgp,

Β size_t msgsz, int msgflg);

int msgrcv(int msqid, void *msgp,

Β size_t msgsz, long msgtyp, int msgflg);

Π—Π΄Π΅ΡΡŒ

msgid
являСтся дСскриптором ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° msgget(2). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€
msgtyp
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π±ΡƒΡ„Π΅Ρ€, содСрТащий Ρ‚ΠΈΠΏ сообщСния ΠΈ Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π΅Π½
msgsz
Π±Π°ΠΉΡ‚. Π‘ΡƒΡ„Π΅Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ поля:

long msgtype
Ρ‚ΠΈΠΏ сообщСния
char msgtext[]
Π΄Π°Π½Π½Ρ‹Π΅ сообщСния

АргумСнт

msgtyp
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΈΠΏ сообщСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΡ… Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ получСния. Если
msgtyp
Ρ€Π°Π²Π΅Π½ 0, функция msgrcv(2) ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°
msgtyp
Π²Ρ‹ΡˆΠ΅ 0, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ сообщСниС ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Если
msgtyp
мСньшС 0, функция msgrcv(2) ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сообщСниС с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ°, мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎΠ³ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ
msgtyp
.

ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ свойством β€” Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов. Для Π΄Π΅ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚

msgtype
, Π½Π° основании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ любой процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ msgrcv(2) ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅.

Рассмотрим Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ взаимодСйствия процСссов, ΠΊΠΎΠ³Π΄Π° сСрвСрный процСсс обмСниваСтся Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с нСсколькими ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ. Бвойство ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний. Для этого сообщСниям, направляСмым ΠΎΡ‚ любого ΠΈΠ· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² сСрвСру, Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, скаТСм, Ρ€Π°Π²Π½Ρ‹ΠΌ 1. Если Π² Ρ‚Π΅Π»Π΅ сообщСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ сСбя (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ свой PID), Ρ‚ΠΎ сСрвСр смоТСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сообщСниС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, присваивая Ρ‚ΠΈΠΏ сообщСния Ρ€Π°Π²Π½Ρ‹ΠΌ этому ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция msgrcv(2) позволяСт ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ сообщСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Ρ‚ΠΈΠΏΠΎΠ²), сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ сообщСния с Ρ‚ΠΈΠΏΠΎΠΌ 1, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ β€” сообщСния с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ ΠΈΡ… процСссов. Π‘Ρ…Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ взаимодСйствия прСдставлСна Π½Π° рис. 3.19.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIX - img_44.jpeg

Рис. 3.19. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСний Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

Атрибут

msgtype
Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния порядка извлСчСния сообщСний ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ порядок получСния сообщСний Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ FIFO β€” сообщСния ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π² порядкС ΠΈΡ… записи. Однако ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΈΠΏ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для назначСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° сообщСний, этот порядок Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния "Здравствуй, ΠœΠΈΡ€!", ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ сообщСния:

Ѐайл описания mesg.h

#define MAXBUFF 80

#define PERM 0666

/* ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ структуру нашСго сообщСния. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ

Β Β  ΠΎΡ‚ структуры msgbuf, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ mtype. Π’ Π΄Π°Π½Π½ΠΎΠΌ

Β Β  случаС структура сообщСния состоит ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΠ±ΠΌΠ΅Π½Π° */

typedef struct our msgbuf {

Β long mtype;

Β char buff[MAXBUFF];

} Message;

Π‘Π΅Ρ€Π²Π΅Ρ€:

#include <sys/ipc.h>

#include <sys/msg.h>

#include "mesg.h"

main() {

Β /* Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° нашСго сообщСния (ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚

Β Β Β  структуры msgbuf) */

Β Message message;

Β key_t key;

Β int msgid, length, n;

Β /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ */

Β if ((key = ftok("server", 'A')) < 0) {

Β  printf("НСвозмоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡\n");

Β  exit(1);

Β }

Β /* Π’ΠΈΠΏ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… сообщСний */

Β message.mt_type = 1L;

Β /* Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний */

Β if ((msgid = msgget(key, Π Π•RМ | IPC_CREAT)) < 0) {

Β  printf("НСвозмоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ\n");

Β  exit(1);

Β }

Β /* ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ сообщСниС */

Β n =

Β  msgrcv(msgid, &message, sizeof(message), message.mtype, 0);

Β /* Если сообщСниС поступило, Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ Π΅Π³ΠΎ содСрТимоС

Β Β Β  Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» */

Β if (n > 0) {

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

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

Β Β  exit(1);

Β  }

Β } else {

Β  printf("Ошибка чтСния сообщСния\n");

Β  exit(1);

Β }

Β /* Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ€ΡƒΡ‡ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ */