Создать zombie.

Тема в разделе "WASM.UNIX", создана пользователем Mika0x65, 26 янв 2009.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Читаю сейчас книгу по UNIX, там описывается как и почему появляются zombie. То, что это процессы, занимающие элемент таблицы proc и не дождавшиеся вызова wait от предка я знал и раньше. Более подробное объяснение (в моей интерпретации) выглядит так:

    1. Процесс А создает процесс Б.
    2. Процесс Б умирает.
    3. Процесс А умирает.
    4. init становится предком процесса Б и ждет от него SIGCHLD, чтобы сделать ему wait. Т.к. процесс Б мертв, то сигнала init не получит. zombie готов.

    Правда, при приеме осиротевших процессов init может делать им wait с флагом WNOHANG, но, как я понимаю, раньше такого флага не было и создать zombie было совсем просто. Чтобы смоделировать шаги, описанные выше, я написал такой код:

    Код (Text):
    1. format ELF
    2.  
    3. public main as 'main'
    4. extrn fork
    5. extrn sleep
    6. extrn exit
    7.  
    8. main:
    9.  call fork
    10.  test eax, eax
    11.  jz @f
    12.   push 5
    13.   call sleep ;предок спит больше и умирает.
    14.  jmp .endif
    15. @@:
    16.   push 3
    17.   call sleep ;потомок спит меньше и тоже мрет.
    18. .endif:
    19.  add esp, 0x4
    20.  push 0x0
    21.  call exit
    Однако, zombie не появился. Собственно, вопрос: как создать zombie и от чего они появляются? Заранее благодарен.

    Код (Text):
    1. [mikae@****~]$ uname -a
    2. 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. Значит, создать его таки можно, но как -- неясно.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Mika0x65
    Я думаю это переводить не стоит, но всеже дам вырезку из книги:
    на сколько я понимаю, код должен быть такой:
    http://www.yendor.com/programming/unix/apue/proc/fork2.c
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Интересно, т.е. получается, что если родительский процесс завершается корректно, то зомби не остается. Видимо, init об этом как-то заботится (только пока непонятно как). Попробовал код, зомби не остается (ОС та же).
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Об этом шелл заботится обычно.
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Mika0x65
    все просто
    init периодически дергает wait, что приводит к завершению зомби-процессов
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    n0name
    Сейчас исходников sh нет, но, кажется, он просто делает wait для foreground процессов и ловит SIGCHLD для background.

    rei3er
    Т.е. "вручную" создать зомби не получится? И раньше тоже так было? У меня просто книга довольно старая, но хорошая.

    P.S. Интерес не практический, просто хочется знать.
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Mika0x65
    давай для начала разберемся, про какую конкретно ОС идет речь ;)
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Эксперименты провожу на 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, если ты не против.
     
  9. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    В теме, про которую вы говорите, я не разбираюсь, но хочу разобраться.

    Как я понял - когда завершается какой-то процесс, то он не завершается до конца. Он перестает работать, но от него остается "тело" (зомби), занимающее память и он все еще находится в списке процессов.
    То есть процесс остается чтобы его родительский процесс с помощью функции wait смог узнать о том, что этот процесс завершился. После вызова wait зомби-процесс, наконец, умирает окончательно. Если бы этого не было ф-я wait сказала бы что "процесса с таким pid'ом нет".
    Но иногда случается что родительский процесс не вызывает wait или зависает после завершения дочернего процесса. Тогда зомби остается жить. Зомби изчезнет из списка процессов и перестанет занимать память только если кто-то станет его родителем (н-р init) и вызовет wait (или когда компьютер перезагрузится). Например, после завершения одного процесса все его дочерние процессы (сироты) усыновляются процессом init.
    Все это так?

    А то в 2-х других книжках написано что зомби это - просто зависнувший процесс, который сдохнет только после перезагрузки системы.

    Я в жизни только 1 раз встречал зомби, который являлся телом sh. Я думаю, что для того, чтобы возник зомби-процесс и остался жить, надо:
    1) Чтобы родительский процесс завис (н-р, бесконечный цикл)
    2) а дочерний завершил свою работу
    Тем самым, родитель не умрет и его дочерний процесс не усыновится процессом init, и родительский процесс не вызовет функцию wait.

    Изменено:
    Если бы этого не было ф-я wait сказала бы что "процесса с таким pid'ом нет" или никогда бы не вернула управления.
    Заменено на:
    Если бы этого не было ф-я wait сказала бы что "процесса с таким pid'ом нет".
     
  10. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Еще бы хотел задать вопрос (настолько маленький, что отдельную тему создавать излишне):

    daemon - переводится как "домовой" и правильно произносится как "дэймон", а не "демон"???

    А то во всех книгах (кроме одной) все дэймоны называются "демонами", (а не домовыми), ссылаясь на эмблему чертика во FreeBSD.
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    AndreyMust19
    Да, это так, с поправкой:
    Никогда не вернет управление в случае, если потомок зависнет. Когда ты его грохнешь все пойдет своим чередом.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec7.html#ch10lev1sec7.
     
  13. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    D.A.E.M.O.N - Disk And Execution MONitor

    Переводить надо или сам поймешь?
     
  14. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    osrootd
    Ну вот, еще один вариант. Так кому же верить?
     
  15. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    AndreyMust19
    Этот вариант - из официального UNIX MANUAL.
    Все остальное - бред
     
  16. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    А этот твой UNIX MANUAL - какого года и откуда?