Guest User

Untitled

a guest
Jun 3rd, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/msg.h>
  6.  
  7. typedef struct mesgbuf {
  8.  long mtype;
  9.  char buff[1024];
  10. } mesg;
  11.  
  12. char *data[] = {
  13. "Гой ты, Русь, моя родная,\n\
  14. Хаты - в ризах образа...\n\
  15. Не видать конца и края -\n\
  16. Только синь сосет глаза.\n\n",
  17.  
  18. "Как захожий богомолец,\n\
  19. Я смотрю твои поля.\n\
  20. А у низеньких околиц\n\
  21. Звонно чахнут тополя.\n\n",
  22.  
  23. "Пахнет яблоком и медом\n\
  24. По церквам твой кроткий Спас.\n\
  25. И гудит за корогодом\n\
  26. На лугах веселый пляс.\n\n",
  27.  
  28. "Побегу по мятой стежке\n\
  29. На приволь зеленых лех,\n\
  30. Мне навстречу, как сережки,\n\
  31. Прозвенит девичий смех.\n\n",
  32.  
  33. "Если крикнет рать святая:\n\
  34. Кинь ты Русь, живи в раю!\n\
  35. Я скажу: Не надо рая,\n\
  36. Дайте родину мою.\n"
  37. };
  38.  
  39. void parent_proc(void) { //Функция родительского процесса
  40.  mesg message;
  41.  key_t key;
  42.  int msgid, len;
  43.  int done = 0; //Показатель окончания передачи данных процессом
  44.  key = ftok("data", 'A'); //Получение ключа
  45.  msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
  46.  message.mtype = 3L; //Тип сообщения 3 необходим для инициализации
  47.  message.buff[0] = 0; //дочерних процессов. Отправляются два таких
  48.  msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
  49.  message.buff[0] = 1; //байта 0 и 1
  50.  msgsnd(msgid, &message, sizeof(message), 0);
  51.  for (;;) {
  52.   if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  53.    len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  54.    if (message.buff[0] == 0) done |= 0x1; //Если это пустая
  55.                                          //строка, то устанавливаем флаг завершения передачи
  56.    else write(1, message.buff, len); //иначе выводим строку
  57.   }
  58.   if ((done & 0x2) == 0) { //Аналогично для второго процесса
  59.    len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  60.    if (message.buff[0] == 0) done |= 0x2;
  61.    else write(1, message.buff, len);
  62.   }
  63.   if (done == 0x3) { //Если оба процесса завершили передачу, то
  64.    msgctl(msgid, IPC_RMID, 0); //завершаем работу
  65.   return;
  66.   }
  67.  }
  68. }
  69. void child_proc(void) {
  70.  mesg message;
  71.  key_t key;
  72.  int msgid, whoami, str, len;
  73.  key = ftok("data", 'A'); //Получение ключа
  74.  msgid = msgget(key, 0); //Открытие очереди сообщений
  75.  msgrcv(msgid, &message, sizeof(message), 3L, 0); //Получение сообщения инициализации
  76.  whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
  77.  message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
  78.  for (str = 0; str < 5; str++) { //Цикл по четверостишиям
  79.   if (str % 2 == whoami) { //В зависимости от номера, процесс будет передавать чётные или нечётные четверостишия
  80.    len = sprintf(message.buff,"%s",data[str]);
  81.    msgsnd(msgid, &message, len, 0); //Отправление сообщения
  82.   }
  83.  }
  84.  message.buff[0] = 0;
  85.  msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
  86.  return;
  87. }
  88.  
  89. int main() {
  90.  if (!fork()) {
  91.   child_proc();
  92.   return 0;
  93.  }
  94.  if (!fork()) {
  95.   child_proc();
  96.   return 0;
  97.  }
  98.  parent_proc();
  99.  return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment