[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