После создания дочернего процесса и родительский и дочерний процессы выполняются и диспетчируются независимо. В некоторых ситуациях необходимо, чтобы родительский процесс ожидал завершения дочернего процесса. Для этого используются функции семейства 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_дочернего_процесса). Поясните полученные коды.
Содержание отчета:
Цель работы.
Краткое изложение теории.
В рабочем отчете зафиксировать задание, результат его выполнения.
Сделать выводы по работе.