Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>
  5. //Идентификаторы процессов и файла
  6. int fd, pid1, pid2, pid3;
  7. FILE *file;
  8. //буффер
  9. char arr[20];
  10. //количество итераций
  11. int N = 10;
  12. //счётчик
  13. int finishedCount = 0;
  14.  
  15. //обработчик прерывания первого процесса
  16. void process1_write(int signum)
  17. {
  18.     printf ("Child 1 write to file, pid = %d\n", getpid());
  19.     for (int i = 0; i < N; ++i)
  20.     {
  21.         printf("c1: %d\n", write(fd, "A", 1)); //пишем в файл
  22.     }
  23.     printf("Child 1 finished\n" );
  24.     kill(pid1, SIGUSR1);//посылаем сигнал основному процессу
  25. }
  26.  
  27.  
  28. //обработчик прерывания второго процесса, всё аналогично первому процессу
  29. void process2_write(int signum)
  30. {
  31.     printf ("Child 2 write to file, pid = %d\n", getpid());
  32.     for (int i = 0; i < N; ++i)
  33.     {
  34.         printf("c2: %d\n", write(fd, "B", 1));
  35.     }
  36.     printf("Child 2 finished\n" );
  37.     kill(pid1, SIGUSR1);
  38. }
  39.  
  40.  
  41. //обработчик прерывания основного процесса
  42. void process_main_result(int signum)
  43. {
  44.  
  45. //если пригёл сигнал увеличиваем счётчик
  46.         finishedCount++;
  47.         printf("Finished:  %d \n",finishedCount);
  48.    
  49.     if (finishedCount == 2) //если оба процесса закончили
  50.     {
  51.         file = fopen("res.txt", "r");//открываем файл и считываем содержимое, записывая в буфер arr
  52.         fgets(arr, N*3, file);
  53.         printf("Result:  %s \n",arr);
  54.         kill(pid2, SIGKILL);//посылаем всем  процессам сигнал завершения
  55.         kill(pid3, SIGKILL);
  56.         kill(pid1, SIGKILL);
  57.     }
  58. }
  59.  
  60.  
  61. int main()
  62. {
  63.     //получаем id основного процесса
  64.     pid1 = getpid();
  65.     fd = open("res.txt", O_CREAT | O_RDWR | O_TRUNC, 0666); //создаём или открываем файл
  66.     printf("Введите количество байт:\n");
  67.     scanf("%d",&N); // считываем количество байт
  68.    
  69.     signal(SIGUSR1, process1_write); //устанавливаем обработчик сигнала
  70.      
  71.     pid2 = fork();//создаём процесс 2
  72.     if (pid2 != 0)
  73.     {
  74.         pid3 = fork(); //создаём процесс 3
  75.     }
  76.     if (pid2 == 0)
  77.     {
  78.      
  79.         printf ("Child 1, pid = %d\n", getpid());
  80.          
  81.         signal(SIGUSR1, process1_write); //обработчик сигнала второго процесса
  82.         for(;;);
  83.     }
  84.     else if (pid3 == 0)
  85.     {
  86.      
  87.         printf ("Child 2, pid = %d\n", getpid());
  88.          
  89.         signal(SIGUSR1, process2_write);//обработчик сигнала третьего
  90.         for(;;);
  91.     }
  92.     else
  93.     {
  94.         signal(SIGUSR1, process_main_result); //обработчик сигнала основного процесса
  95.         sleep(5);//задержка
  96.         kill(pid2, SIGUSR1);//посылаем сигнал второму процессу
  97.         sleep(5);
  98.         kill(pid3, SIGUSR1);//посылаем сигнал третьему процессу
  99.         for(;;);
  100.     }    
  101.              
  102.        
  103.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement