The OpenNET Project / Index page

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

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


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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру