Помощь - Поиск - Пользователи - Календарь
Полная версия: freeBSD процесс-zombie
Форум «Всё о Паскале» > Системы, Сети, Технологии > ОС и ПО.
klem4
Подскажите как в системе исскуственно повесить зомби. Нигде не могу найти.
xds
Программа создает 10 процессов-зомби:
#include <sys/types.h>                                            
#include <unistd.h>
#include <stdio.h>

int main()
{
int i;
for (i = 1; i <= 10; i++)
if (fork() == 0)
{
printf("Zombie process %d created.\n", i);
return 0;
}
puts("Press ENTER to close parent process...");
getchar();
return 0;
}

Если перед нажатием ENTER посмотреть в ps, то обнаружим 10 процессов в состоянии Z:
Код
$ ps                                  
  PID TT  STAT       TIME COMMAND    
21578 p0  Is+     0:00.25 -ksh (ksh)  
2947 p1  Is      0:00.99 -ksh (ksh)  
31163 p1  R+      0:00.00 ps          
$ parent                              
Zombie process 2 created.            
Zombie process 1 created.            
Press ENTER to close parent process...
Zombie process 3 created.            
Zombie process 4 created.            
Zombie process 5 created.            
Zombie process 6 created.            
Zombie process 8 created.            
Zombie process 9 created.            
Zombie process 10 created.            
Zombie process 7 created.            
^Z[1] + Suspended            parent  
$ ps                                  
  PID TT  STAT       TIME COMMAND    
21578 p0  Is+     0:00.25 -ksh (ksh)  
27795 p1  Z       0:00.00 (parent)    
8359 p1  Z       0:00.00 (parent)    
9088 p1  Z       0:00.00 (parent)    
23949 p1  Z       0:00.00 (parent)    
14734 p1  Z       0:00.00 (parent)    
1312 p1  Z       0:00.00 (parent)    
26772 p1  Z       0:00.00 (parent)    
22099 p1  Z       0:00.00 (parent)    
7346 p1  Z       0:00.00 (parent)    
20051 p1  Z       0:00.00 (parent)    
2947 p1  Is      0:01.00 -ksh (ksh)  
18621 p1  T       0:00.05 parent      
13552 p1  R+      0:00.01 ps          
$
klem4
хех, так просто ? А почему ихнее имущество не будет передано init ?


UPDATE
аа перед завершением программы нужно ps смотреть, я правильно понял ?
то есть после нажатия Enter они будут всетаки удалены из списка процессов ?
xds
Цитата(klem4 @ 29.01.2008 15:40) *
аа перед завершением программы нужно ps смотреть, я правильно понял ?
то есть после нажатия Enter они будут всетаки удалены из списка процессов ?
Да, конечно - уничтожение родительского процесса всегда приводит к уничтожению дочерних. Проблема становится в полный рост, когда родительский процесс - демон.
klem4
к сожалению, все чего удалось добиться - поучить статусы RE для процессов ...
xds
Очень странно. Подробно опиши, что ты делал (желательно со скрином консоли).
klem4
да все по логике, как ты и посоветовал ... когда вылезает надпись press enter, скидываю основнной процесс ^Z и смотрю ps, пробовал также запускать программу в фоновом режиме, результат аналогичный.


Кстати, какой результат у тебя выдаст такой код:

#include <unistd.h>
#include <stdio.h>

int main(void) {

int i;
if (fork()) {
/* Родитель */
sleep(2);
_exit(0);
}
for (i=0; i < 5; i++) {
printf("My parent is %d\n", getppid());
sleep(1);
}
}


вот тут скорее ребенок должен стать зомби, но и в этом случае этого не происходит, информация о нем передается init -- PPID = 1
xds
Цитата(klem4 @ 31.01.2008 16:14) *
вот тут скорее ребенок должен стать зомби, но и в этом случае этого не происходит, информация о нем передается init -- PPID = 1
Не должен, т. к. он не завершен (из-за sleep пребывает в состоянии I). Зомби возможны только, если дочерний процесс завершен, а родительский продолжает работать и не удосужился прочитать статус завершения дочернего. В твоем случае незавершенные дочерние процессы передаются корневому. Были бы завершенными - исчезли бы вместе с родительским.

Зомби - это состояние, когда процесс завершен, память освобождена, а система хранит статус завершения до его востребования родительским процессом.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.