Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/wait.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/shm.h>
- /*
- В аргументах командной строки программе задается одно целое число count - число процессов-сыновей (1 ≤ count ≤ 100).
- На стандартном потоке ввода подается последовательность 32-битных знаковых целых чисел в текстовом виде. Последовательность завершается признаком конца ввода.
- Родитель создает count сыновей, которые нумеруются от 0 до count-1. Сыновья работают последовательно.
- В свою очередь каждый сын считывает одно число из входной последовательности, выводит на стандартный поток вывода свой номер и считанное число.
- Затем очередь работы передается сыну с номером, равным остатку (математическому) от деления считанного числа на количество процессов.
- После создания всех процессов родитель передает очередь чтения процессу с номером 0. Затем родитель дожидается завершения работы сыновей и сам завершает работу.
- Для синхронизации процессов используйте семафоры SysV IPC.
- Идентификатор массива семафоров выбирайте самостоятельно. В конце работы программы все созданные объекты IPC должны быть уничтожены.
- Стандартные потоки ввода и вывода являются каналами.
- Ниже приведен пример работы при числе процессов 3. */
- int operation (long val, int mod)
- {
- return ((val < 0 ? -val : val) % mod);
- }
- void term_kids (int semid)
- {
- wait(NULL);
- semctl(semid, 0, IPC_RMID, 0);
- while (wait(NULL) >= 0) {
- // wait for all kids
- }
- }
- int main(int argc, char* argv[])
- {
- if (argc < 1) {
- exit(1);
- }
- long count = (long) strtol(argv[1], NULL, 10);
- int semid = semget(12, count, IPC_CREAT | 0666);
- struct sembuf sem = {0, 1, 0};
- semop(semid, &sem, 1);
- for (int i = 0; i < count; i++) {
- if (!(fork())) {
- struct sembuf pi = {(unsigned short) i, -1, 0};
- for (;;) {
- if (semop(semid, &pi, 1) < 0) {
- exit(0);
- }
- long x;
- if (scanf("%ld", &x) != 1) {
- exit(0);
- } else {
- printf("%d %ld\n", i, x);
- struct sembuf s_loc = {operation(x,count), 1, 0};
- semop(semid, &s_loc, 1);
- }
- }
- }
- }
- term_kids(semid);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement