On Tue, Apr 15, 2008 at 09:42:02PM +0400, Evgeny Sinelnikov wrote: > 2008/4/15 Dmitry V. Levin : [...] > > У меня был один простой аргумент: ECHILD не происходит. > > Я сделал коммит, который ждёт ECHILD: > > http://git.altlinux.org/people/ldv/packages/?p=installer.git;a=commitdiff;h=0.4-alt12-1-g713c354 > > На практике (в 0.4-alt13) это приводит к таймауту после 20 секунд ожидания. > > Кроме того на практике (в 0.4-alt13) loop_change_fd() на 2.6.24 всё > ещё виснет... Я полагаю, что это влияние оптимизации кода ядра.... > Процесс не весь загружен в память, а после переброски файлового > дескриптора на файл с нулями грузить его уже неоткуда... Это вполне вероятно, поэтому reexec, видимо, нужно вернуть. > По поводу же ожидания в 20 секунд... Совершенно непонятна логика... > ведь чтобы дождаться ECHILD не стоит отрывать обработку SIGCHILD... Логика такая: поскольку не все процессы после рассылки SIGKILL завершаются, дожидаться появления ECHILD бесполезно. > Иначе оно и будет висеть те самые 20 секунд... Причём не совсем 20, > ведь sleep() всё-таки прерывается несколько раз по сигналу SIGCHILD от > тех самых процессов, которых стоит дождаться... Реализация sleep() следит за этими прерываниями. > Объединённый и исправленный вариант доступен здесь: > http://git.etersoft.ru/people/sin/packages/installer.git/ > > В этот релиз вошло изменение решающее проблему loop_change_fd() на > 2.6.24 путём переброски /sbin/init в память на начальном этапе > установки. Надеюсь, это окончательный вариант исправлений... Не стоит на это надеяться. ;) -- ldv