Advertisement
nblknn

OS 8

Dec 19th, 2024
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/wait.h>
  4. #include <signal.h>
  5. #include <unistd.h>
  6. #include <sys/time.h>
  7.  
  8. pid_t processes[9];
  9. int processIndex = 0, countUSR1 = 0, isTERM = 0;
  10.  
  11. long unsigned getMicroSeconds() {
  12.     struct timeval tp;
  13.     gettimeofday(&tp, NULL);
  14.     return tp.tv_usec;
  15. }
  16.  
  17. void sendSignals(int index, int signal, int sigCount) {
  18.     for (int i = 1; i <= sigCount; i++) {
  19.         kill(processes[index], signal);
  20.         printf("Process %d (pid %d || ppid %d) sent USR1 to process %d at time %lu\n", processIndex, getpid(), getppid(), index, getMicroSeconds());
  21.         sleep(2);
  22.     }
  23.     kill(processes[index], SIGTERM);
  24. }
  25.  
  26. void sendSignalsToGroup(int *indexes, int signal, int sigCount) {
  27.     setpgid(processes[indexes[0]],processes[indexes[0]]);
  28.     setpgid(processes[indexes[1]], processes[indexes[0]]);
  29.     pid_t pgid = getpgid(processes[indexes[0]]);
  30.     for (int i = 1; i <= sigCount; i++) {
  31.         killpg(pgid, signal);
  32.         printf("Process %d (pid %d || ppid %d) sent USR1 to process %d & %d at time %lu\n", processIndex, getpid(), getppid(), indexes[0], indexes[1], getMicroSeconds());
  33.         sleep(2);
  34.     }
  35.     killpg(pgid, SIGTERM);
  36. }
  37.  
  38. void usrHandler(int i) {
  39.     sleep(1);
  40.     countUSR1++;
  41.     printf("Process %d (pid %d || ppid %d) got USR1 at time %lu\n", processIndex, getpid(), getppid(), getMicroSeconds());
  42. }
  43.  
  44. void termHandler(int i) {
  45.     sleep(1);
  46.     isTERM = 1;
  47. }
  48.  
  49. void processActions(int processIndex, int sigCount) {
  50.     signal(SIGUSR1, usrHandler);
  51.     signal(SIGTERM, termHandler);
  52.     sleep(1);
  53.  
  54.     switch (processIndex) {
  55.         case 1: { int *indexes = malloc(2 * sizeof(int));
  56.                 indexes[0] = 2;
  57.                 indexes[1] = 3;
  58.                 sendSignalsToGroup(indexes, SIGUSR1, sigCount);
  59.                 free(indexes);
  60.                 break;
  61.             }
  62.  
  63.         case 2: { int *indexes = malloc(2 * sizeof(int));
  64.                 indexes[0] = 4;
  65.                 indexes[1] = 5;
  66.                 sendSignalsToGroup(indexes, SIGUSR1, sigCount);
  67.                 free(indexes);
  68.                 break;
  69.             }
  70.  
  71.         case 5: sendSignals(6, SIGUSR1, sigCount);
  72.                 break;
  73.  
  74.         case 6: { int *indexes = malloc(2 * sizeof(int));
  75.                 indexes[0] = 7;
  76.                 indexes[1] = 8;
  77.                 sendSignalsToGroup(indexes, SIGUSR1, sigCount);
  78.                 free(indexes);
  79.                 break;
  80.             }
  81.  
  82.         case 8: sendSignals(1, SIGUSR1, sigCount);
  83.                 break;
  84.     }
  85.  
  86.     int status = 0;
  87.     while (wait(&status) > 0) ;
  88.     while (!isTERM);
  89.     printf("--Process %d (pid %d || ppid %d) terminating after %d signal USR1 at time %lu--\n", processIndex, getpid(), getppid(), countUSR1, getMicroSeconds());
  90.     exit(0);
  91. }
  92.  
  93. // 1->2,3 / 2->4,5 / 5->6 / 6->7,8
  94.  
  95. void createProcesses(int mypipe[2]) {
  96.     int status;
  97.     processes[0] = getpid();
  98.     processes[1] = fork();
  99.     if (processes[1] > 0) {
  100.         write(mypipe[1], &processes[1], sizeof(pid_t));
  101.         // 0
  102.         return;
  103.     }
  104.     else {
  105.         processes[2] = fork();
  106.         if (processes[2] > 0) {
  107.             processIndex = 1;
  108.             processes[3] = fork();
  109.             if (processes[3] == 0) {
  110.                 processIndex = 3;
  111.                 // 3
  112.                 return;
  113.             }
  114.             // 1
  115.             else return;
  116.         }
  117.         else {
  118.         processIndex = 2;
  119.         processes[4] = fork();
  120.         if (processes[4] == 0) {
  121.             processIndex = 4;
  122.             // 4
  123.             return;
  124.         }
  125.         processes[5] = fork();
  126.         if (processes[5] > 0) {
  127.             // 2
  128.             return;
  129.         }
  130.         processIndex = 5;
  131.         processes[6] = fork();
  132.         if (processes[6] > 0) {
  133.             // 5
  134.             return;
  135.         }
  136.         processIndex = 6;
  137.         processes[7] = fork();
  138.         if (processes[7] == 0) {
  139.             processIndex = 7;
  140.             // 7
  141.             return;
  142.         }
  143.         processes[8] = fork();
  144.         if (processes[8] == 0) {
  145.             processIndex = 8;
  146.             read(mypipe[0], &processes[1], sizeof(pid_t));
  147.         }
  148.         // 6 & 8
  149.         return;
  150.         }  
  151.     }
  152. }
  153.  
  154. int main(int argc, char *argv[]) {
  155.     if (argc < 2) return -1;
  156.     int mypipe[2];
  157.     pipe(mypipe);
  158.     createProcesses(mypipe);
  159.     sleep(1);
  160.     close(mypipe[0]);
  161.     close(mypipe[1]);
  162.    /* printf("Process #%d || Pid %d || All pids %d %d %d %d %d %d %d %d\n",
  163.     processIndex, getpid(), processes[1], processes[2], processes[3],
  164.     processes[4], processes[5], processes[6], processes[7], processes[8]);*/
  165.     if (processIndex != 0) processActions(processIndex, atoi(argv[1]));
  166.     int status;
  167.     while (wait(&status) > 0) ;
  168.     return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement