ТУСУР_ОпСист_Лаб4_Вар1. Целью выполнения
Скачать 80.82 Kb.
|
Цель работыЦелью выполнения настоящей лабораторной работы является получение навыков программного управления процессами с помощью сигналов. Ход выполнения работыЗадание: Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. Далее в течение 10 секунд процесс- отец выводит на экран какое-то сообщение. По истечении этого времени он уничтожает два из четырех процессов, используя для этого всего одну команду. Перед завершением процесс-отец выводит на экран перечень процессов данного пользователя. Код программы на языке Си#include pid_t pid1,pid2,pid3,pid4; void MyAlarm (int var){ kill(pid1, SIGKILL); kill(pid2, SIGKILL); system("ps -a"); _Exit (0);} int main(int argc, char **argv) { switch(pid1 = fork()) { case -1: printf("Error fork\n"); exit(1); break; case 0: printf("Child process #1 started (pid = %d)\n", getpid()); for(; ;); break; default: switch(pid2 = fork()) { case -1: printf("Error fork\n"); exit(1); break; case 0: printf("Child process #2 started (pid = %d)\n", getpid()); for(; ;); break; default: switch(pid3 = fork()){ case -1: printf("Error fork\n"); exit(1); break; case 0: printf("Child process #3 started (pid = %d)\n", getpid()); for(; ;); break; default: switch(pid4 = fork()) { case -1: printf("Error fork\n"); exit(1); break; case 0: printf("Child process #4 started (pid = %d)\n", getpid()); for(; ;); break; default: printf("Im alive 10 sec... (pid = %d)\n", getpid()); signal (SIGALRM, MyAlarm); alarm (10); while (1) {} exit(0); break;} break;} break;} break;}} Словесное описание кода:Идентификаторы процессов pid_t делаем с глобальной областью видимости. Форкаем 4 дочерних процесса (типичный паттерн как по учебнику), каждый из которых выполняет бесконечный цикл. Родительский процесс заводит 10-секундный аларм и уходит в бесконечный цикл. По истечению 10 секунд убиваем 1 и 2 дочерний процесс, отсылаем на консоль команду показать процессы текущего пользователя и родительский процесс завершается. Скриншоты работы программы:Компилируем код в исполняемый модуль gcc lab4.c и запускаем его ./a.out.Выдается сообщение, что 4 дочерних процесса запущены: Child process #1 started (pid = 3674) Child process #2 started (pid = 3675) Child process #3 started (pid = 3676) Child process #4 started (pid = 3677) Родительский процесс сообщает, что он живет 10 секунд Im alive 10 sec… (pid = 3673) По истечению 10 секунд убиваем 1 и 2 процесс и выводим список процессов текущего пользователя. Мы видим, что процессы #1 и #2 с идентификатор 3674 и 3675 помечены как «убитые» (defunct). После чего завершается родительский процесс. В консоли набираем команду показать процессы текущего пользователя ps -a. Мы видим, что родительский процесс отсутствует (идентификатор 3673), то есть он завершен. Остались только процессы #3 и #4 (идентификаторы 3676, 3677). ВыводыВ ходе выполнения лабораторной работы мы научились работать с процессами, создавать, отправлять сигналы. |