Мое почтение всем. Читаю сейчас книгу по UNIX, там описывается как и почему появляются zombie. То, что это процессы, занимающие элемент таблицы proc и не дождавшиеся вызова wait от предка я знал и раньше. Более подробное объяснение (в моей интерпретации) выглядит так: 1. Процесс А создает процесс Б. 2. Процесс Б умирает. 3. Процесс А умирает. 4. init становится предком процесса Б и ждет от него SIGCHLD, чтобы сделать ему wait. Т.к. процесс Б мертв, то сигнала init не получит. zombie готов. Правда, при приеме осиротевших процессов init может делать им wait с флагом WNOHANG, но, как я понимаю, раньше такого флага не было и создать zombie было совсем просто. Чтобы смоделировать шаги, описанные выше, я написал такой код: Код (Text): format ELF public main as 'main' extrn fork extrn sleep extrn exit main: call fork test eax, eax jz @f push 5 call sleep ;предок спит больше и умирает. jmp .endif @@: push 3 call sleep ;потомок спит меньше и тоже мрет. .endif: add esp, 0x4 push 0x0 call exit Однако, zombie не появился. Собственно, вопрос: как создать zombie и от чего они появляются? Заранее благодарен. Код (Text): [mikae@****~]$ uname -a Linux **** 2.6.27.9-159.fc10.i686 #1 SMP Tue Dec 16 15:12:04 EST 2008 i686 i686 i386 GNU/Linux P.S. Спросил владельца сервера, он видел у себя zombie. Значит, создать его таки можно, но как -- неясно.
Mika0x65 Я думаю это переводить не стоит, но всеже дам вырезку из книги: на сколько я понимаю, код должен быть такой: http://www.yendor.com/programming/unix/apue/proc/fork2.c
Интересно, т.е. получается, что если родительский процесс завершается корректно, то зомби не остается. Видимо, init об этом как-то заботится (только пока непонятно как). Попробовал код, зомби не остается (ОС та же).
n0name Сейчас исходников sh нет, но, кажется, он просто делает wait для foreground процессов и ловит SIGCHLD для background. rei3er Т.е. "вручную" создать зомби не получится? И раньше тоже так было? У меня просто книга довольно старая, но хорошая. P.S. Интерес не практический, просто хочется знать.
Эксперименты провожу на FC (2.6.27.9-159.fc10.i686 #1 SMP Tue Dec 16 15:12:04 EST 2008 i686 i686 i386 GNU/Linux). Читаю Вахалия, "UNIX изнутри". P.S. Отписал в ICQ, если ты не против.
В теме, про которую вы говорите, я не разбираюсь, но хочу разобраться. Как я понял - когда завершается какой-то процесс, то он не завершается до конца. Он перестает работать, но от него остается "тело" (зомби), занимающее память и он все еще находится в списке процессов. То есть процесс остается чтобы его родительский процесс с помощью функции wait смог узнать о том, что этот процесс завершился. После вызова wait зомби-процесс, наконец, умирает окончательно. Если бы этого не было ф-я wait сказала бы что "процесса с таким pid'ом нет". Но иногда случается что родительский процесс не вызывает wait или зависает после завершения дочернего процесса. Тогда зомби остается жить. Зомби изчезнет из списка процессов и перестанет занимать память только если кто-то станет его родителем (н-р init) и вызовет wait (или когда компьютер перезагрузится). Например, после завершения одного процесса все его дочерние процессы (сироты) усыновляются процессом init. Все это так? А то в 2-х других книжках написано что зомби это - просто зависнувший процесс, который сдохнет только после перезагрузки системы. Я в жизни только 1 раз встречал зомби, который являлся телом sh. Я думаю, что для того, чтобы возник зомби-процесс и остался жить, надо: 1) Чтобы родительский процесс завис (н-р, бесконечный цикл) 2) а дочерний завершил свою работу Тем самым, родитель не умрет и его дочерний процесс не усыновится процессом init, и родительский процесс не вызовет функцию wait. Изменено: Если бы этого не было ф-я wait сказала бы что "процесса с таким pid'ом нет" или никогда бы не вернула управления. Заменено на: Если бы этого не было ф-я wait сказала бы что "процесса с таким pid'ом нет".
Еще бы хотел задать вопрос (настолько маленький, что отдельную тему создавать излишне): daemon - переводится как "домовой" и правильно произносится как "дэймон", а не "демон"??? А то во всех книгах (кроме одной) все дэймоны называются "демонами", (а не домовыми), ссылаясь на эмблему чертика во FreeBSD.
AndreyMust19 Да, это так, с поправкой: Никогда не вернет управление в случае, если потомок зависнет. Когда ты его грохнешь все пойдет своим чередом.
http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec7.html#ch10lev1sec7.