[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Пример сообщений - получатель

15-18          Сообщение представляет  собой структуру.  Первое поле в
          структуре  должно  быть  длинным  целым.  Остаток  структуры
          определяется пользователем.

22        Создает ключ  на  основе  текущей  рабочей  директории.  Как
          msend, так  и mrecv  должны запускаться  в одной  и  той  же
          рабочей директории.

31-36          Получать и  распечатывать сообщения  в цикле,  пока  не
          получено good-bye.

37-38          Послать  сообщение,   состоящее  только  из  типа  (без
          содержимого),  обратно   к  msend.   При   получении   этого
          сообщения, msend удалит очередь и завершится.

Файл: mrecv.c
                    ПРИМЕР СООБЩЕНИЙ - ПОЛУЧАТЕЛЬ
 1  #include <sys/types.h>
 2  #include <unistd.h>
 3  #include <string.h>
 4  #include <stdio.h>
 5  #include <stdlib.h>
 6  #include <sys/ipc.h>
 7  #include <sys/msg.h>
 8  #define MAX_RCV_SZ60
 9  static const long Fifo = 0L;
10  static const long Done = 99L;
11  static const int Zero_len = 0;
12
13  main()
14  {
15  struct msgbuf {
16  long mtype;
17  char mtext[MAX_RCV_SZ];
18  } buf;
19  key_t key;
20  int mid, rtn;
21
22  if((key = ftok(".", 'a')) == -1){
23  perror("Can't form key");
24  exit(1);
25  }
26  mid = msgget(key, 0);
27  if (mid == -1) {
28  perror("Receiver can't access msg queue");
29  exit(2);
30  }
31  while(1) {
32  rtn = msgrcv(mid,&buf,MAX_RCV_SZ,Fifo,0);
33  printf("rtn=%d buf.mtype=%ld buf.mtext=%s\n",
34  rtn, buf.mtype, buf.mtext);
35  if(!strcmp(buf.mtext,"good-bye"))break;
36  }
37  buf.mtype = Done;
38  msgsnd(mid, &buf, Zero_len, 0);
39  return(0);
40  }