The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Причина повисания процессов в состоянии piperd (gcc signal zombie select pipe)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: gcc, signal, zombie, select, pipe,  (найти похожие документы)
Date: Fri, 21 Feb 2003 12:44:51 +0500 From: Valentin Nechayev <netch@segfault.kiev.ua> 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-

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Ваш комментарий
Имя:         
E-Mail:      
Заголовок:
Текст:





  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor