Ожидание завершения процесса

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

Функция wait.

pid_t wait (int *status)

Блокирует вызывающий процесс до тех пор, пока не завершится один из его дочерних процессов. Если к моменту выдачи wait дочерний процесс уже завершен, то wait возвращает управление немедленно. Если *status не равен NULL, то в переменную status записывается код завершения процесса. wait возвращает PID завершившегося процесса или -1 если дочерние процессы отсутствуют (в последнем случае устанавливает переменную errno).

 

Состояние "зомби". Когда процесс завершается, информация о нем сохраняется в системных таблицах для того, чтобы родительский процесс мог получить информацию о нем, в частности, его код возврата при помощи функции wait. Если же родительский процесс не вызывает wait, то дочерний процесс продолжает существовать в так называемом состоянии "зомби". Наличие таких процессов нежелательно, т.к. они потребляют системные ресурсы. Если родительский процесс завершится, так и не вызвав wait, то процесс-потомок удаляется из памяти процессом init (с PID=1).

 

3. Порядок выполнения работы:

1.Посмотреть процессы ps –f. Прокомментировать. Для этого почитать man ps.

2.Написать два сценария loop и loop2. Текст сценариев: Loop:

while true; do true; done

 

Loop2:

while true; do true; echo ‘Hello’; done

 

3.Запустить loop2 на переднем плане: sh loop2.

4.Остановить, послав сигнал STOP.

5.Посмотреть последовательно несколько раз ps –f. Записать сообщение, объяснить.

6.Убить процесс loop2, послав сигнал kill -9 PID. Записать сообщение. Прокомментировать.

 

7. В программе pr2.c основной процесс создает три дочерних процесса и ожидает их завершения. Выполните программу и запишите выходные данные.

/* pr2.c */

#include <stdio.h>

#include <unistd.h>

int main()

{

int i, pid, status, w;

for (i=0; i<3; ++i)

{

pid = fork();

if (pid ==0)

exit(getpid() % 256);

}

while ((w = wait(&status))&& w!= -1)

printf ("Child %x returns status %x\n", w, status);

return 0;

}

 

 

NB: версии библиотек могут зависеть от дистрибутива. Могут понадобиться, например, #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h>#include <string.h>….

 

8. Замените exit на kill(SIGKILL, pid_дочернего_процесса). Поясните полученные коды.

Содержание отчета:

Цель работы.

Краткое изложение теории.

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

Сделать выводы по работе.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: