21.4. Пример программы на С
21.4. Пример программы на С
В п. 9.2.3 я сказал о состояниях процесса и перечислил среди них состояние «зомби». Зомби — это процесс, который уже завершился, но его родитель еще не получил сигнала о его завершении и не удалил его структуру из таблицы процессов. Такое может произойти, когда процесс-родитель почему-либо не готов к завершению потомка. Сейчас мы искусственно создадим такого зомби. Процесс-родитель породит потомка и уснет на 10 секунд. Потомок завершится через 2 секунды, а в течение 8 секунд он будет находиться в состоянии зомби. Напоминаю, что состояние процесса можно увидеть по команде top.
Листинг 21.3. Файл zombie.с
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
int main() {
int pid;
int status, died;
pid=fork();
switch(pid) {
case -1:
printf("ошибка fork ");
exit(-1);
case 0:
printf(" Я потомок процесса %d ", getppid());
printf(" Мой PID %d ", getpid());
// Ждем 2 секунды и завершаемся
sleep(2);
exit(0);
default:
printf("Я родитель. ");
printf("Мой PID %d " , getpid());
// Ждем завершения дочернего процесса
// через 10 секунд, а потом убиваем его
sleep(10);
if (pid & 1)
kill(pid,SIGKILL);
died = wait(&status);
}
}
Скомпилируйте файл zombie.с и запустите исполняемый файл zombie:
$ gcc -о zombie zombie.с
$ ./zombie
Я родитель.
Мой PID 1147
Я потомок процесса 1147
Мой PID 1148
Запомните последний номер и быстро переключитесь на другую консоль, где введите команду top -p 1148:
16:04:22 up 2 min, 3 users, load average: 0,10, 0,10, 0,04
1 processes: 0 sleeping, 0 running, 1 zombie, 0 stopped
CPU states: 4,5% user, 7,6% system, 0,0% nice, 0,0% iowait, 87,8% idle
Mem: 127560k av, 76992k used, 50568k free, 0k shrd, 3872k buff
24280k active, 19328k inactive
Swap: 152576k av, 0k used, 152576k free 39704k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1148 den 17 0 0 0 0 Z 0,0 0,0 0:00 zombie <defunct>
Мы видим, что в списке процессов появился один зомби (STAT = Z), который «проживет» в таком состоянии целых 8 секунд.
Данный текст является ознакомительным фрагментом.