Ключевые слова:gcc, signal, zombie, select, pipe, (найти похожие документы)
Date: Fri, 21 Feb 2003 12:44:51 +0500
From: Valentin Nechayev <[email protected]>
Newsgroups: ftn.ru.unix.prog
Subject: Причина повисания процессов в состоянии piperd
EG> Пишу в программерскую эху в основном для того чтобы самому не наступать
EG> на такие грабли и вообще разобраться что происходит.
EG> Иногда (редко) cron (job runner) на моей FreeBSD 4.7-STABLE, запустивший
EG> через /bin/sh задачу, подвисает в состоянии piperd и висит в этой позе
EG> даже когда sh уже зомби. Приходится руками убивать runner'а.
EG> Похоже на какой-то вид race condition. Из-за чего такое может случаться?
Hапример, что-то такого рода:
void on_sigchld( int sig ) {
wait( &istatus );
flag_child_exited = 1;
}
signal( SIGCHLD, on_sigchld );
for(;;) {
if( flag_child_exited ) break;
select_for_read( pipe[0] );
}
возможно, с размаскированием сигналов перед входом в ожидание по select'у
и маскированием после него обратно. Как бы ты ни проверял на входе в select
или poll наличие признака события, до момента запуска собственно ожидания
есть окно, в которое может попасть сигнал.
Это решается, например, через pselect(), если он есть.
Если нет - сигнальным пайпом: обработчик события пишет в signalpipe[1],
а select просит чтения по signalpipe[0].
-netch-