Главная страница

ТУСУР_ОпСист_Лаб4_Вар1. Целью выполнения


Скачать 80.82 Kb.
НазваниеЦелью выполнения
Дата26.06.2022
Размер80.82 Kb.
Формат файлаdocx
Имя файлаТУСУР_ОпСист_Лаб4_Вар1.docx
ТипДокументы
#615502
  1. Цель работы



Целью выполнения настоящей лабораторной работы является получение навыков программного управления процессами с помощью сигналов.


  1. Ход выполнения работы



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


Код программы на языке Си


#include #include #include #include #include #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).

  1. Выводы



В ходе выполнения лабораторной работы мы научились работать с процессами, создавать, отправлять сигналы.


написать администратору сайта