Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.19 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <errno.h>
  9.  
  10.  
  11. int main()
  12. {
  13.     int fd[2], result;
  14.     size_t size;
  15.     char resstring[64];
  16.    
  17.     int semid;
  18.     key_t key;
  19.    
  20.     if((key = ftok("p4.c", 0)) < 0) {
  21.         printf("Can't generate key\n");
  22.         exit(-1);
  23.     }
  24.    
  25.     if((semid = semget(key, 2, 0666 | IPC_CREAT)) < 0){
  26.         printf("Can't get semid\n");
  27.         exit(-1);
  28.     }
  29.    
  30.     struct sembuf mybuf;
  31.     mybuf.sem_op = 1;
  32.     mybuf.sem_flg = 0;
  33.     mybuf.sem_num = 1;
  34.     //Устанавливаем отсутствие данных в пайпе
  35.     semop(semid, &mybuf, 1);
  36.     mybuf.sem_num = 0;
  37.     //Увеличиваем семафор на 1, чтобы оба процесса не залочились
  38.     semop(semid, &mybuf, 1);
  39.     mybuf.sem_op = 0;
  40.    
  41.     if(pipe(fd) < 0) {
  42.         printf("Can't create pipe\n");
  43.         exit(-1);
  44.     }
  45.    
  46.     result = fork();
  47.    
  48.     if(result <0) {
  49.         printf("Can't fork child\n");
  50.         exit(-1);
  51.     } else if (result > 0) {
  52.         //parent
  53.         char *msg[] = {
  54.             "Parent message 1",
  55.             "Parent message 2",
  56.             "Parent message 3",
  57.             "Parent message 4",
  58.             "Parent message 5"
  59.         };
  60.        
  61.         int s = 0, r = 0, hd = 0;
  62.        
  63.        
  64.         while(1) {
  65.             //Пытаемся занять канал
  66.             mybuf.sem_op = -1;
  67.             semop(semid, &mybuf, 1);
  68.             //Заняли
  69.             //Проверяем, есть ли данные в канале
  70.             mybuf.sem_op = 0;
  71.             mybuf.sem_flg = IPC_NOWAIT;
  72.             mybuf.sem_num = 1;
  73.             if(!(semop(semid, &mybuf, 1) < 0)) {
  74.                 //Есть данные в канале
  75.                 //Получаем и пишем
  76.                 read(fd[0], resstring, 64);
  77.                 printf("%s\n", resstring);
  78.                 r++;
  79.                 hd = 1;
  80.             } else {
  81.                 hd = 0;
  82.             }
  83.             //Посылаем данные, если еще не выслали все
  84.             if(s < 5) {
  85.                 write(fd[1], msg[0], strlen(msg[0])+1);
  86.                 s++;
  87.                 if(!hd) {
  88.                     //Если в канале не было данных
  89.                     mybuf.sem_op = -1;
  90.                     mybuf.sem_flg = 0;
  91.                     mybuf.sem_num = 1;
  92.                     semop(semid, &mybuf, 1);
  93.                 }
  94.             } else if(hd) {
  95.                 //Прочитали, но не написали, а данные в канале были
  96.                 mybuf.sem_op = 1;
  97.                 mybuf.sem_flg = 0;
  98.                 mybuf.sem_num = 1;
  99.                 semop(semid, &mybuf, 1);   
  100.             }
  101.            
  102.             //Освобождаем канал
  103.             mybuf.sem_op = 1;
  104.             mybuf.sem_num = 0;
  105.             semop(semid, &mybuf, 1);
  106.  
  107.             if(r == 4 && s == 5)
  108.                 break;
  109.         }
  110.         printf("Parent exit\n");
  111.         //size = write(fd[1], "Hello, world!", 14);
  112.         //printf("Parent exit, writed %d\n", size);
  113.     } else {
  114.         //child
  115.         char *msg[] = {
  116.             "Child message 1",
  117.             "Child message 2",
  118.             "Child message 3",
  119.             "Child message 4",
  120.             "Child message 5"
  121.         };
  122.         //size = read(fd[0], resstring, 14);
  123.         int s = 0, r = 0, hd = 0;
  124.        
  125.         while(1) {
  126.             //Пытаемся занять канал
  127.             mybuf.sem_op = -1;
  128.             semop(semid, &mybuf, 1);
  129.             //Заняли
  130.             //Проверяем, есть ли данные в канале
  131.             mybuf.sem_op = 0;
  132.             mybuf.sem_flg = IPC_NOWAIT;
  133.             mybuf.sem_num = 1;
  134.             if(!(semop(semid, &mybuf, 1) < 0)) {
  135.                 //Есть данные в канале
  136.                 //Получаем и пишем
  137.                 read(fd[0], resstring, 64);
  138.                 printf("%s\n", resstring);
  139.                 r++;
  140.                 hd = 1;
  141.             } else {
  142.                 hd = 0;
  143.             }
  144.             //Посылаем данные, если еще не выслали все
  145.             if(s < 5) {
  146.                 write(fd[1], msg[0], strlen(msg[0])+1);
  147.                 s++;
  148.                 if(!hd) {
  149.                     //Если в канале не было данных
  150.                     mybuf.sem_op = -1;
  151.                     mybuf.sem_flg = 0;
  152.                     mybuf.sem_num = 1;
  153.                     semop(semid, &mybuf, 1);
  154.                 }
  155.             } else if(hd) {
  156.                 //Прочитали, но не написали, а данные в канале были
  157.                 mybuf.sem_op = 1;
  158.                 mybuf.sem_flg = 0;
  159.                 mybuf.sem_num = 1;
  160.                 semop(semid, &mybuf, 1);   
  161.             }
  162.             //Освобождаем канал
  163.             mybuf.sem_op = 1;
  164.             mybuf.sem_num = 0;
  165.             semop(semid, &mybuf, 1);
  166.            
  167.            
  168.             if(r == 4 && s == 5)
  169.                 break;
  170.         }
  171.         printf("Child exit\n");
  172.         //printf("%s\n",resstring);
  173.        
  174.     }
  175.     semctl(semid, 0, IPC_RMID, 0);
  176.     return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement