Как выполнить процесс зомби и сирот в одной программе?

Опубликовано: 30 Декабря, 2021

Предпосылка: процессы зомби и сирот в C

Зомби-процесс:
Зомби-процесс - это процесс, который завершил выполнение, но все еще имеет запись в таблице процессов. Эта запись по-прежнему необходима, чтобы родительский процесс мог читать статус выхода своего дочернего процесса.
Завершенный процесс не может покинуть систему, пока его родительский элемент не примет код возврата. Если его родительский процесс уже мертв, он уже был принят процессом «init», который всегда принимает коды возврата своих дочерних элементов. Однако, если родительский процесс жив, но никогда не выполняет wait (), код возврата процесса никогда не будет принят, и процесс останется зомби.

Сиротский процесс:
Сиротский процесс - это процесс, который все еще выполняется, но родитель которого умер. Они не становятся зомби-процессами; вместо этого они принимаются init (процесс ID 1), который ожидает своих потомков.
Когда родитель умирает раньше своего потомка, потомок автоматически усыновляется исходным процессом «init», PID которого равен 1.

Подход:
В следующем коде мы создали сценарий, в котором есть родительский элемент и у него есть дочерний элемент, и у этого дочернего элемента также есть дочерний процесс, во-первых, если наш процесс попадает в дочерний процесс, мы переводим нашу систему в спящий режим на 5 секунд, чтобы мы могли завершить родительский процесс, чтобы его дочерний процесс стал сиротой, затем мы сделали дочерний процесс зомби, дочерний процесс завершает свое выполнение, в то время как родительский (т.е. дочерний) спит в течение 1 секунды, следовательно, дочерний ребенок не вызывает завершение , и эта запись все еще существует в таблице процессов.

Ниже представлена реализация вышеуказанного подхода:

// C program to execute zombie and
// orphan process in a single program
#include <stdio.h>
int main()
{
int x;
x = fork();
if (x > 0)
printf ("IN PARENT PROCESS MY PROCESS ID
: %d ", getpid());
else if (x == 0) {
sleep(5);
x = fork();
if (x > 0) {
printf ("IN CHILD PROCESS MY PROCESS ID :%d
PARENT PROCESS ID : %d ", getpid(), getppid());
while (1)
sleep(1);
printf ("IN CHILD PROCESS MY PARENT PROCESS ID
: %d ", getppid());
}
else if (x == 0)
printf ("IN CHILD'S CHILD PROCESS
MY PARENT ID : %d ", getppid());
}
return 0;
}

Выход:

Примечание. Приведенный выше код может не работать с онлайн-компилятором, поскольку fork () отключен.

Хотите учиться на лучших видео и практических задачах, ознакомьтесь с Базовым курсом C для базового и продвинутого C.



C++ C