Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.31 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/wait.h>
  6. #include <sys/types.h>
  7. #include <sys/ipc.h>
  8. #include <sys/sem.h>
  9. #include <sys/shm.h>
  10.  
  11. /*
  12.  В аргументах командной строки программе задается одно целое число count - число процессов-сыновей (1 ≤ count ≤ 100).
  13.  
  14.  На стандартном потоке ввода подается последовательность 32-битных знаковых целых чисел в текстовом виде. Последовательность завершается признаком конца ввода.
  15.  
  16.  Родитель создает count сыновей, которые нумеруются от 0 до count-1. Сыновья работают последовательно.
  17.  В свою очередь каждый сын считывает одно число из входной последовательности, выводит на стандартный поток вывода свой номер и считанное число.
  18.  Затем очередь работы передается сыну с номером, равным остатку (математическому) от деления считанного числа на количество процессов.
  19.  
  20.  После создания всех процессов родитель передает очередь чтения процессу с номером 0. Затем родитель дожидается завершения работы сыновей и сам завершает работу.
  21.  
  22.  Для синхронизации процессов используйте семафоры SysV IPC.
  23.  
  24.  Идентификатор массива семафоров выбирайте самостоятельно. В конце работы программы все созданные объекты IPC должны быть уничтожены.
  25.  
  26.  Стандартные потоки ввода и вывода являются каналами.
  27.  
  28.  Ниже приведен пример работы при числе процессов 3. */
  29.  
  30. int operation (long val, int mod)
  31. {
  32.     return ((val < 0 ? -val : val) % mod);
  33. }
  34.  
  35. void term_kids (int semid)
  36. {
  37.     wait(NULL);
  38.     semctl(semid, 0, IPC_RMID, 0);
  39.     while (wait(NULL) >= 0) {
  40.         // wait for all kids
  41.     }
  42. }
  43.  
  44. int main(int argc, char* argv[])
  45. {
  46.     if (argc < 1) {
  47.         exit(1);
  48.     }
  49.     long count = (long) strtol(argv[1], NULL, 10);
  50.     int semid = semget(12, count, IPC_CREAT | 0666);
  51.     struct sembuf sem = {0, 1, 0};
  52.     semop(semid, &sem, 1);
  53.     for (int i = 0; i < count; i++) {
  54.         if (!(fork())) {
  55.             struct sembuf pi = {(unsigned short) i, -1, 0};
  56.             for (;;) {
  57.                 if (semop(semid, &pi, 1) < 0) {
  58.                     exit(0);
  59.                 }
  60.                 long x;
  61.                 if (scanf("%ld", &x) != 1) {
  62.                     exit(0);
  63.                 } else {
  64.                     printf("%d %ld\n", i, x);
  65.                     struct sembuf s_loc = {operation(x,count), 1, 0};
  66.                     semop(semid, &s_loc, 1);
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     term_kids(semid);
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement