[devel] q: installer: Killing all remaining processes (forever)
Dmitry V. Levin
=?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Ср Апр 16 05:20:51 MSD 2008
On Wed, Apr 16, 2008 at 04:03:19AM +0400, Evgeny Sinelnikov wrote:
> > $ strace -qe waitpid ./waitpid
> > waitpid(-1, 0xbf88880c, WNOHANG) = -1 ECHILD (No child processes)
> > waitpid(-1, 0xbf88880c, WNOHANG) = -1 ECHILD (No child processes)
>
> Странный пример, у него же нет потомков, и нет обработчика SIGCHILD.
> Но он демонстрирует, что ECHILD приходит.
Он демонстрирует, что повторный waitpid снова приводит к ECHILD.
> > > Это же подтверждено не практике. В моём случае стоит
> > > ожидание только по этому сигналу, иначе цикл в killall() у меня вообще
> > > не завершится... Но он завершается, а следовательно ECHILD, как и
> > > ожидается, приходит...
> >
> > ECHILD у init произойдёт только в случае если в системе не останется
> > процессов, у которых ppid==1; такое может произойти, но может и не
> > произойти. У нас на стенде init не получал ECHILD ни разу.
>
> Такое обязательно произойдёт, если этого дождаться... Иначе нет
> никакой гарантии, что процессы, занявшие ресурсы /mnt/destination
> завершены. В коде же инсталятора это ожидание раньше полагалось на
> секунду после первого общего сигнала. А то, что оно не происходило
> означает, что никогда не было момента, чтобы последний сигнал был
> получен и успел быть обработан. Хотя конечно это странно...
>
> ECHILD может быть не получен, только, если последний процесс не
> пришлёт SIGCHILD... Если такое вдруг произойдёт, то таймаут, конечно,
> выход...
ECHILD может не случиться, если в системе остался хотя бы один процесс
с ppid==1, который не собирается завершаться. На нашем стенде это
происходит всегда.
> Текущий вариант (когда превратиться в alt14) должен быть вполне
> работоспособен... Вот только 5 секунд - это маловато...
А вот мне кажется, что и 5 секунд многовато. Не договоримся. :)
> Ведь sleep()
> прерывается во время прихода сигнала и, при интенсивном приходе
> SIGCHILD на этапе ожидания завершения процессов, может пять раз подряд
> прерваться может. И никакой гарантии, что 6 и 7 процессы ещё не
> завершились нет. Статистически же поймать это будет теперь ещё
> сложнее...
Можно использовать альтернативную реализацию sleep(3), например:
static void mysleep(time_t sec)
{
struct timespec req = { sec, 0 }, rem;
for (; req.tv_sec || req.tv_nsec; req = rem)
if (!nanosleep(&req, &rem))
break;
}
--
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20080416/a4e67688/attachment-0002.bin>
Подробная информация о списке рассылки Devel