Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.12 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/shm.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/wait.h>
  7. #include <sys/sem.h>
  8. #include <string.h>
  9.  
  10. void sem(int semId, int n, int d)
  11. {
  12.     struct sembuf op;
  13.     op.sem_op = d;
  14.     op.sem_flg = 0;
  15.     op.sem_num = n;
  16.     semop(semId, &op, 1);
  17. }
  18.  
  19. void unlockSem(int semId, int n)
  20. {
  21.     sem(semId, n, 1);
  22. }
  23.  
  24. void lockSem(int semId, int n)
  25. {
  26.     sem(semId, n, -1);
  27. }
  28.  
  29. int getSem(int semId, int n)
  30. {
  31.     return semctl(semId, 0, GETVAL, n);
  32. }
  33.  
  34. int get_random_number(int min, int max)
  35. {
  36.     return rand() % (max - min) + min;
  37. }
  38.  
  39. void qs(int semId, int *s_arr, int first, int last)
  40. {
  41.     if (first < last)
  42.     {
  43.         int left = first, right = last;
  44.         lockSem(semId, (left + right) / 2);
  45.         int middle = s_arr[(left + right) / 2];
  46.         unlockSem(semId, (left + right) / 2);
  47.         do
  48.         {
  49.             lockSem(semId, left);
  50.             while (s_arr[left] < middle)
  51.             {
  52.                 unlockSem(semId, left);
  53.                 left++;
  54.                 lockSem(semId, left);
  55.             }
  56.             unlockSem(semId, left);
  57.             lockSem(semId, right);
  58.             while (s_arr[right] > middle)
  59.             {
  60.                 unlockSem(semId, right);
  61.                 right--;
  62.                 lockSem(semId, right);
  63.             }
  64.             unlockSem(semId, right);
  65.             if (left <= right)
  66.             {
  67.                 lockSem(semId, left);
  68.                 int tmp = s_arr[left];
  69.                 lockSem(semId, right);
  70.                 s_arr[left] = s_arr[right];
  71.                 unlockSem(semId, left);
  72.                 s_arr[right] = tmp;
  73.                 unlockSem(semId, right);
  74.                 left++;
  75.                 right--;
  76.             }
  77.         } while (left <= right);
  78.         qs(semId, s_arr, first, right);
  79.         qs(semId, s_arr, left, last);
  80.     }
  81. }
  82.  
  83. int main(int argv, char *argc[])
  84. {
  85.     if (argv != 4)
  86.     {
  87.         printf("Not supported arguments count\n");
  88.         return 0;
  89.     }
  90.     int n = atoi(argc[1]);
  91.     int min = atoi(argc[2]);
  92.     int max = atoi(argc[3]);
  93.    
  94.     int memId = shmget(IPC_PRIVATE, sizeof(int)*n, 0600|IPC_CREAT|IPC_EXCL);
  95.     int *mem = (int *)shmat(memId, 0, 0);
  96.    
  97.     srand(time(NULL));
  98.     for (int i=0; i<n; i++)
  99.         mem[i] = get_random_number(min, max);
  100.    
  101.     int semId = semget(IPC_PRIVATE, n, 0600 | IPC_CREAT);
  102.    
  103.     for (int i=0; i<n; i++)
  104.         unlockSem(semId, i);
  105.    
  106.     int child_id = fork();
  107.    
  108.     if (child_id)
  109.     {
  110.         int i = 0;
  111.         int status;
  112.         do
  113.         {
  114.             printf("%d: ", i);
  115.             for (int j = 0; j < n; j++)
  116.             {
  117.                 int status = getSem(semId, j);
  118.                 lockSem(semId, j);
  119.                 if (!status)
  120.                 {
  121.                     printf("%d ", mem[j]);
  122.                 }
  123.                 else
  124.                 {
  125.                     printf("[%d] ", mem[j]);
  126.                 }
  127.  
  128.                 fflush(stdout);
  129.                 unlockSem(semId, j);
  130.             }
  131.             printf("\r\n");
  132.             status = waitpid(child_id, NULL, WNOHANG);
  133.             i++;
  134.         } while (!status);
  135.  
  136.         printf("Sort finished \r\n");
  137.         for (int j=0; j<n; j++)
  138.             printf("%d ", mem[j]);
  139.  
  140.         shmctl(memId, 0, IPC_RMID);
  141.         semctl(semId, 0, IPC_RMID);
  142.     }
  143.     else
  144.     {
  145.         qs(semId, mem, 0, n-1);
  146.     }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement