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
29.01.2008 12:40
хех, так просто ? А почему ихнее имущество не будет передано init ?
UPDATE аа перед завершением программы нужно ps смотреть, я правильно понял ? то есть после нажатия Enter они будут всетаки удалены из списка процессов ?
xds
29.01.2008 14:42
Цитата(klem4 @ 29.01.2008 15:40)
аа перед завершением программы нужно ps смотреть, я правильно понял ? то есть после нажатия Enter они будут всетаки удалены из списка процессов ?
Да, конечно - уничтожение родительского процесса всегда приводит к уничтожению дочерних. Проблема становится в полный рост, когда родительский процесс - демон.
klem4
31.01.2008 1:34
к сожалению, все чего удалось добиться - поучить статусы RE для процессов ...
xds
31.01.2008 10:28
Очень странно. Подробно опиши, что ты делал (желательно со скрином консоли).
klem4
31.01.2008 13:14
да все по логике, как ты и посоветовал ... когда вылезает надпись 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
31.01.2008 21:57
Цитата(klem4 @ 31.01.2008 16:14)
вот тут скорее ребенок должен стать зомби, но и в этом случае этого не происходит, информация о нем передается init -- PPID = 1
Не должен, т. к. он не завершен (из-за sleep пребывает в состоянии I). Зомби возможны только, если дочерний процесс завершен, а родительский продолжает работать и не удосужился прочитать статус завершения дочернего. В твоем случае незавершенные дочерние процессы передаются корневому. Были бы завершенными - исчезли бы вместе с родительским.
Зомби - это состояние, когда процесс завершен, память освобождена, а система хранит статус завершения до его востребования родительским процессом.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.