SaveText.Ru

Без имени
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <sys/sem.h>
  7.  
  8. int inc(int semid, struct sembuf* buf) {
  9.     buf->sem_op = 1;
  10.     buf->sem_flg = 0;
  11.     buf->sem_num = 0;
  12.  
  13.     return semop(semid, buf, 1);
  14. }
  15.  
  16. int dec(int semid, struct sembuf* buf) {
  17.     buf->sem_op = -1;
  18.     buf->sem_flg = 0;
  19.     buf->sem_num = 0;
  20.  
  21.     return semop(semid, buf, 1);
  22. }
  23.  
  24. /**
  25.  * Моя логика:
  26.  * Изначально семафор 0, dec - уменьшает значение на 1, inc - увеличивает.
  27.  * Если значение < 0, то он ждёт.
  28.  * Логика работы отца и ребёнка расписана прямо в коде.
  29.  */
  30. int main()
  31. {
  32.     // Инициализируем:
  33.     int parent[2], result;
  34.     size_t size = 0;
  35.     key_t key;
  36.     char pathname[] = "05-3.c";
  37.     struct sembuf buffer;
  38.  
  39.     int semid;
  40.     char resstring[14];
  41.  
  42.     // Создаём Pipes родителя и ребёнка:
  43.     if (pipe(parent) < 0) {
  44.         printf("Невозможно создать pipe отцаnr");
  45.         exit(-1);
  46.     }
  47.  
  48.     if ((key = ftok(pathname, 0)) < 0) {
  49.         printf("Ключ не сгенерирован.n");
  50.         exit(-1);
  51.     }
  52.  
  53.     // Создаём семафорчик
  54.     if ((semid = semget(key, 1, 0666)) < 0) {
  55.         printf("Семафор не найден, повторяю: n");
  56.         if ((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0) {
  57.             printf("Не могу получить Semidn");
  58.             exit(-1);
  59.         }
  60.         printf("Успешно создан!n");
  61.     }
  62.  
  63.  
  64.     result = fork();
  65.  
  66.     if (result < 0) {
  67.         printf("Неудачный forknr");
  68.         exit(-1);
  69.     }
  70.  
  71.     // Отец:
  72.     else if (result > 0) {
  73.         int N;
  74.         printf("Введите N: n");
  75.         scanf("%d", &N);
  76.         if (N < 2) {
  77.             printf("N должен быть больше или равен 2.n");
  78.             exit(-1);
  79.         }
  80.  
  81.         for (size_t i = 0; i < N; i++)
  82.         {
  83.              // Пишем ребёнку
  84.             if (write(parent[1], "Hello, world!", 14) != 14) {
  85.                 printf("Can't write all stringnr");
  86.                 exit(-1);
  87.             }
  88.  
  89.             printf("Пара №%d, Отец отправил рёбенку месседж.nr", i + 1);
  90.  
  91.             // РАЗРЕШАЕМ ДЕТЁНКУ ПРОЧИТАТЬ, А САМ УХОДИМ В ОЖИДАНИЕ ОТВЕТА ОТ НЕГО:
  92.             inc(semid, &buffer);
  93.             dec(semid, &buffer);
  94.              // Читаем ребёнка:
  95.             size = read(parent[0], resstring, 14);
  96.  
  97.             if (size != 14) {
  98.                 printf("Can't read from childnr");
  99.                 exit(-1);
  100.             }
  101.  
  102.             printf("Отец прочитал с ребёнка: %snr", resstring);
  103.         }
  104.         close(parent[0]);
  105.     }
  106.     else {
  107.         // Ребёнок
  108.         int counter = 0;
  109.         // Читаем отца:
  110.         while(1){
  111.             // ЖДЁМ ОТВЕТ ОТ ОТЦА ПОКА ОН ЗАПИШЕТ:
  112.             dec(semid, &buffer);
  113.             size = read(parent[0], resstring, 14);
  114.  
  115.             if (size < 0) {
  116.                 close(parent[1]);
  117.                 close(parent[0]);
  118.  
  119.                 printf("Всё тип топ, все покинули чат-чатn");  
  120.                 return 0;
  121.             }
  122.  
  123.             // Инфа от отца:
  124.             printf("Пара №%d, Ребёнок получил с отца: %snr", ++counter, resstring);
  125.  
  126.             // Передадим отцу приветики:
  127.             if (write(parent[1], "Hi, my parent", 14) != 14) {
  128.                 printf("Невозможно написать всю строку.n");
  129.                 exit(-1);
  130.             }
  131.             // ГОВОРИМ ОТЦУ: "ВСЕ ОК, МОЖЕШЬ ЧИТАТЬ МОЙ ПИСЬМО И ЗАПИСЫВАТЬ"
  132.             inc(semid, &buffer);
  133.         }
  134.     }
  135.     return 0;
  136. }
  137.  

Share with your friends:

Print