лучшая идентификация ребенка - PullRequest
1 голос
/ 02 мая 2020

Я попытался создать процесс zomb ie, используя команду ps для проверки. Хотя решение является хорошим, оно не очень наводит на мысль о том, чтобы идентифицировать ребенка как зомба ie. Кто-нибудь может мне помочь с некоторыми улучшениями?

это мой код:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   int pid=fork();
   if (pid>0)
   {
       printf("in parent process");
       sleep(30);
       execlp("ps","ps",NULL);
   }
   else if (pid==0) 
   {
       printf("in child process");
   }
   return 0;
}

1 Ответ

0 голосов
/ 04 мая 2020

Процесс Zomb ie не представляет ничего, кроме мертвого процесса, для которого его родитель еще не wait(2) ed. Он существует только для того, чтобы предоставить ядру средство для передачи его родительскому процессу его учетных данных (таких как затраченное время процессора или код завершения), чтобы сделать системный вызов wait(2) надежным.

Нет ничего иначе, в зависимости от операционной системы, вы даже не можете получить параметры командной строки, используемые для ее вызова, или имя процесса, который он представляет.

Единственное, что вы можете сделать с процессом zomb ie для его родителя wait(2) для него, и, таким образом, передайте учетные данные, код выхода и другую информацию до его родителя. Ему не назначена память, системные ресурсы не выделены или заблокированы, все ее файловые дескрипторы уже закрыты, только это pid, идентификатор группы процессов, идентификатор сеанса, а также накопленное время процессора и системного пространства пользователя (для него и (накапливает его дочерние элементы) хранится в таблице процессов, поэтому системный вызов wait(2) может также накапливать их, когда родительский процесс exit(2) s или wait(2) s для него.

Как вы, вероятно, вы уже обнаружили, вы не можете kill(2) процесс зомба ie (ну, вы действительно можете kill(2) его родитель, так что он всегда будет в покое - и родитель), так как он уже мертв.

Чтобы лучше идентифицировать процесс, вы должны собрать эту информацию в родительском процессе (родитель получает все это в семействе системных вызовов wait(2)). Вы получите процесс pid_t id, так что вы будете знать, какой из ваших дочерних процессов вы выбрали wait(2). Когда вы (родитель) создали его, вы будете знать все, что нужно, чтобы знать своих детей (вы получили этот pid из системного вызова fork(2) при его создании)

...