Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Работа с процессами и потоками.




Для выполнения данной практической работы требуется установленный дистрибутив Linux или Unix, а также базовые знания любого языка программирования, способного оперировать системными вызовами выбранного дистрибутива.

Данная работа выполняется индивидуально. Каждый студент выполняет собственный вариант задания, номер которого определяется порядковым номером в журнале.

1. Процесс 1 порождает потомка 2, который в свою очередь порождает потомка 3. Добиться того, чтобы эти процессы гарантированно заканчивались в порядке 3, 2, 1.

2. Процесс 1 открывает файл и после этого порождает потомка 2. Процесс 1 пишет в файл, процесс 2 читает из файла и выводит прочитанное на экран. Организовать чтение после записи без использования сигналов.

3. Процесс 1 открывает файл и порождает потомков 2 и 3. Потомки пишут в файл по N байт и завершают работу. После этого процесс 1 считывает данные из файла и выводит на экран. Объяснить полученный результат.

4. Процесс 1 открывает файл и порождает потомка 2. Оба процесса после этого пишут в файл по очереди по N байт. Организовать M циклов записи с помощью сигналов.

5. Процесс 1 открывает файл и порождает потомка 2, после этого пишет в файл N байт, закрывает его и завершается. Потом процесс 2 пишет N байт в файл, закрывает файл и завершается. Для определения очередности записи использовать функцию fstat.

6. Процесс 1 открывает файл и порождает потомка 2, который в свою очередь порождает потомка 3. Процессы 2 и 3 пишут в общий файл, причем процесс 3 не может начать писать раньше, чем процесс 2. Организовать очередность без использования сигналов.

7. Процесс 1 порождает процесс-потомок, ждет его завершения, после этого порождает еще один процесс-потомок и так N раз. Каждый процесс выдает на экран сообщения о начале и завершении работы.

8. Процесс 1 открывает существующий файл и порождает потомков 2 и 3. Все процессы читают из файла данные по одному байту и выводят их на экран с пометками, какой именно процесс выводит данные. Объяснить полученный результат.

9. Процесс 1 открывает файл и порождает потомка 2. Процесс 2 пишет N байт в файл по одному байту, процесс 1, не дожидаясь окончания процесса-потомка, начинает читать из файла по одному байту и выводит их на экран. Процесс 1 завершается, когда достигнут конец файла. Объяснить полученный результат.

10. Программа порождает три процесса, каждый из которых записывает в общий файл число, равное своему номеру. Манипулируя схемой порождения процессов и используя сигналы обеспечить следующее содержимое файла:

1) 1 2 3 2 1

2) 1 2 1 3 1 3 3

3) 3 1 2 1 2 3

11. Процесс 1 открывает файл и после этого порождает потомка 2. Процесс 2 начинает запись в файл после получения сигнала SIG1 от процесса 1 и прекращает ее после получения от процесса 1 сигнала SIG2, который посылается через N секунд после SIG1. Затем процесс 1 читает данные из файла и выводит их на экран.

12. Процесс 1 открывает файл и после этого порождает потомка 2. Один процесс пишет в файл один байт, посылает другому процессу сигнал, другой читает из файла один байт, выводит прочитанное на экран и посылает сигнал первому процессу. Организовать N циклов запись/чтение.

13. Процесс 1 открывает файл и порождает потомков 2 и 3. Потомки после сигнала от предка пишут в файл по N байт, посылают сигналы процессу 1 и завершают работу. После этого процесс 1 считывает данные из файла и выводит на экран.

14. Процесс 1 открывает файл и после этого порождает потомка 2, который в свою очередь порождает потомка 3. Процесс 2 пишет N байт в общий файл, посылает сигнал процессу 3, который тоже пишет N байт в файл и посылает сигнал процессу 1, который считывает данные из файла и выводит их на экран.

15. Процесс 1 открывает файл и порождает потомка 2, после этого пишет в файл N байт и посылает сигнал процессу 2. Процесс 2 пишет N байт в файл, посылает сигнал процессу 1 и завершается. Процесс 1, получив сигнал, считывает данные из файла, выводит их на экран и завершается.

16. Процесс 1 открывает файл и порождает потомков 2 и 3. Потомки пишут в файл по очереди по N байт (M циклов записи, организовать с помощью сигналов) и завершаются. Последний из них посылает сигнал процессу 1, который читает данные и выводит их на экран.

17. Процесс 1 открывает файл, порождает потомка 2, пишет в файл N байт и посылает сигнал SIG1 процессу 2. Процесс 2 по сигналу SIG1 читает данные, выводит их на экран и завершается. Если сигнал от процесса 1 не поступит в течение M секунд, процесс 2 начинает считывать данные по сигналу SIGALRM.

18. Процесс 1 открывает файл и порождает потомка 2, который в свою очередь порождает потомка 3. Процессы 2 и 3 пишут в общий файл, причем процесс 3 не может начать писать раньше, чем процесс 2. Организовать очередность с помощью сигналов. Как только размер файла превысит N байт, процесс 1 посылает потомкам сигнал SIG2 о завершении работы, считывает данные из файла и выводит их на экран.

19. Процесс 1 открывает файл и порождает потомка 2. Процесс 1 с интервалом в 1 секунду (через alarm) посылает M сигналов SIG1 процессу 2, который по каждому сигналу пишет в общий файл по N чисел. Потом процесс 1 посылает процессу 2 сигнал SIG2, процесс 2 завершается. Процесс 1 считывает данные из файла и выводит их на экран.

20. Процесс 1 открывает файл и порождает потомков 2 и 3. Процесс 1 с интервалом в 1 секунду (через alarm) по очереди посылает N сигналов SIG1 процессам 2 и 3, которые по каждому сигналу пишут в общий файл по M чисел. Потом процесс 1 посылает потомкам сигнал SIG2, процессы 2 и 3 завершаются. Процесс 1 считывает данные из файла и выводит их на экран.

21. Процесс 1 открывает два файла и порождает потомков 2 и 3. Процессы 2 и 3 с интервалом в 1 секунду (через alarm) посылают по N сигналов процессу 1, который по каждому сигналу пишет в соответствующий файл по M чисел. Потом процессы 2 и 3 считывают данные из файлов, выводят их на экран и завершаются. Процесс 1 завершается последним.

22. Процесс 1 открывает два файла и порождает потомков 2 и 3. Процессы 2 и 3 посылают по одному сигналу процессу 1, который по каждому сигналу пишет в соответствующий файл M чисел. Процессы 2 и 3 считывают данные из файлов и выводят их на экран. С помощью сигналов организовать непересекающийся вывод данных.

23. Процесс 1 открывает файл и порождает потомка 2. Процесс 2 по сигналу SIG1 от процесса 1 начинает писать в файл, по сигналу SIG2 прекращает запись, а потом по сигналу SIG1 завершается. Сигнал SIG1 поступает с задержкой в 1 секунду относительно первого сигнала SIG2.

24. Процесс 1 открывает файл и порождает потомка 2. Процесс 1 читает данные из файла, процесс 2 пишет данные в файл следующим образом: по сигналу SIG1 от процесса 1 процесс 2 записывает в файл N чисел и посылает процессу 1 сигнал окончания записи; процесс 1 по этому сигналу считывает данные и посылает процессу 2 сигнал SIG1. Процесс 2 всегда пишет данные в начало файла. Организовать M циклов записи/чтения. Прочитанные данные выводятся на экран.

25. Процесс 1 открывает существующий файл и порождает потомка 2. Процесс 1 считывает N байт из файла, выводит их на экран и посылает сигнал SIG1 процессу 2. Процесс 2 также считывает N байт из файла, выводит их на экран и посылает сигнал SIG1 процессу 1. Если одному из процессов встретился конец файла, то он посылает другому процессу сигнал SIG2 и они оба завершаются.

Пример 1. Порождение процессов. Программа в результате выполнения породит три процесса (процесс-предок 1 и процессы-потомки 2 и 3).

#include <sys/types.h>

#include <fcntl.h>

#include <stdio.h>

void main(void)

{ int pid2, pid3, st; /* process 1 */

printf("Process 1, pid = %d:\n", getpid());

pid2 = fork();

if (pid2 == 0) /* process 2 */

{ printf("Process 2, pid = %d:\n", getpid());

pid3 = fork();

if (pid3 == 0) /* process 3 */

{ printf("Process 3, pid = %d:\n", getpid());

sleep(2);

printf("Process 3: end\n");

} /* process 2 */

if (pid3 < 0) printf("Can't create process 3: error %d\n", pid3);

wait(&st);

printf("Process 2: end\n");

}

else /* process 1 */

{ if (pid2 < 0) printf("Can't create process 2: error %d\n", pid2);

wait(&st);

printf("Process 1: end\n");

}

exit(0);

}

В соответствии с программой первоначально будет создан процесс 1 (как потомок интерпретатора shell), он сообщит о начале своей работы и породит процесс 2. После этого работа процесса 1 приостановится и начнет выполняться процесс 2 как более приоритетный. Он также сообщит о начале своей работы и породит процесс 3. Далее начнет выполняться процесс 3, он сообщит о начале работы и "заснет". После этого возобновит свое выполнение либо процесс 1, либо процесс 2 в зависимости от величин приоритетов и от того, насколько процессор загружен другими процессами. Так как ни один из процессов не выполняет никакой работы, они, вероятнее всего, успеют завершится до возобновления процесса 3, который в этом случае завершится последним.

Пример 2. Порождение процессов и их синхронизация. Данная программа в результате выполнения породит два процесса, причем процесс-предок закончится после процесса-потомка.

#include <sys/types.h>

#include <fcntl.h>

#include <stdio.h>

void main(void)

{ int pid2, pid3, st; /* proc 1 */

printf("Process 1, pid = %d: begin\n", getpid());

pid2 = fork();

if (pid2 < 0) printf("Cann't create process 2: error %d\n", pid2);

else

{ if (pid2 == 0) /* process 2 */

{ printf("Process 2, pid = %d: begin\n", getpid());

sleep(1);

printf("Process 2: end\n");

}

else /* process 1 */

{ wait(&st);

printf("Process 1: end\n");

}

}

exit(0);

}

От предыдущей данная программа отличается наличием синхронизации выполнения процессов: процесс-предок ожидает завершения процесса-потомка (функция wait). Сначала выполняется процесс 1, который порождает процесс 2. После начинает выполняться процесс 2, который после выдачи сообщения "заснет". Тогда возобновит выполнение процесс 1, который приостановится до получения сигнала об окончании процесса 2. По истечение указанного периода процесс 2 возобновит свое выполнение, выдаст сообщение и завершится. После этого будет возобновлен процесс 1, который также выдаст сообщение и завершится.

Пример 3. Синхронизация работы процессов. Программа породит три процесса (процесс- предок 0 и процессы- потомки 1 и 2). Процессы 1 и 2 будут обмениваться сигналами и выдавать соответствующие сообщения на экран, а процесс 0 через определенное количество секунд отправит процессам 1 и 2 сигнал завершения и сам прекратит свое функционирование.

#include <sys/types.h>

#include <fcntl.h>

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#define TIMEOUT 10

int f1(int), f2(int), f3(int);

int pid0, pid1, pid2;

void main(void)

{ setpgrp();

pid0 = getpid();

pid1 = fork();

if (pid1 == 0) /* process 1 */

{ signal(SIGUSR1, f1);

pid1 = getpid();

pid2 = fork();

if (pid2 < 0) puts("Fork error");

if (pid2 > 0) for(;;);

else /* process 2 */

{ signal(SIGUSR2, f2);

pid2 = getpid();

kill(pid1,SIGUSR1);

for (;;);

}

}

else /* process 0 */

{ signal(SIGALRM, f3);

alarm(TIMEOUT);

pause();

}

exit(0);

}

int f1(int signum)

{ signal(SIGUSR1, f1);

printf("Process 1 (%d) has got a signal from process 2 (%d)\n",pid1,pid2);

sleep(1);

kill(pid2, SIGUSR2);

return 0;

}

int f2(int signum)

{ signal(SIGUSR2, f2);

printf("Process 2 (%d) has got a signal from process 1 (%d)\n",pid2,pid1);

sleep(1);

kill(pid1, SIGUSR1);

return 0;

}

int f3(int signum)

{ printf("End of job - %d\n", pid0);

kill(0, SIGKILL);

return 0;

}

В отчёте необходимо предоставить код программы с комментариями.


 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных