21.4. Пример программы на С

We use cookies. Read the Privacy and Cookie Policy

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 секунд.

Данный текст является ознакомительным фрагментом.