|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Vakhrushev Andrew 2:5020/400 31 Aug 2001 08:43:36 To : All Subject : Вопрос специалистам по PTHREAD-ам --------------------------------------------------------------------------------
Здравствуйте Всем!
Помогите пожалуйста разобраться в следующей ситуации:
Hаписана и работает программа на FreeBSD, С++, socket-
programming поверх TCP-IP, pthread-ы.
Возникла проблема, когда я начал реализовывать сервис,
чтобы по SIGHUP программа перечитывала конфигурациогнный
файл и отключала/подключала каналы в зависимости от
изменений в этом файле, ну типа inetd.
Почему то когда я блокирую от SIGHUP все потоки, кроме
главного, который и должен обрабатывать сигнал и потом
посылаю SIGHUP присходит следующее: его обрабатывает
обработчик из главного(из которого были созданы другие
потоки) потока, но при этом, если в дочерних потоках
в этот момент обрабатывается write(), то он
прерывается (хотя я блокирую эти потоки от SIGHUP) и
потом при следующем вызове write() потоку посылается
сигнал SIGPIPE. Вопрос - почему прерываются дочерние
потоки, и почему ломается канал (SIGPIPE)?
И как сделать чтобы этого избежать.
Строки касающиеся обработки сигналов внизу:
В main() в главном потоке:
sigset_t sigmask;
struct sigaction action, old_action;
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGPIPE);
if ( pthread_sigmask(SIG_SETMASK, &sigmask, NULL) )
perror("Set signal mask");
action.sa_handler = HUP_Handler;
// action.sa_flags = 0;
action.sa_flags = SA_RESTART;
sigemptyset(&action.sa_mask);
sigaddset(&action.sa_mask, SIGHUP);
sigaddset(&action.sa_mask, SIGPIPE);
if (sigaction(SIGHUP, &action, &old_action) == -1)
{ perror("Sigaction SIGHUP: "); exit(1); }
А в процедуре дочернего потока, одна из функций:
void Thr_Data::pthread_start ()
{
sigset_t set, oldset;
struct sigaction action, old_action;
sigemptyset(&set);
sigaddset(&set, SIGHUP);
if ( pthread_sigmask(SIG_SETMASK, &set, &oldset) )
{ perror("Pthread_Sigsetmask"); *rcp=9; pthread_exit(rcp); }
sigemptyset(&action.sa_mask);
sigaddset(&action.sa_mask, SIGPIPE);
sigaddset(&action.sa_mask, SIGHUP);
action.sa_handler = handlPIPE;
// action.sa_flags = SA_RESTART;
action.sa_flags = 0;
if ( sigaction(SIGPIPE, &action, &old_action) == -1 )
{ perror("Sigaction SIGPIPE: "); *rcp=8; pthread_exit(rcp); }
...
}
Заранее спасибо за помощь.
--
Отправлено через сервер Talk.Ru - http://www.talk.ru
--- ifmail v.2.15dev5
* Origin: Talk.ru (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/6488677846b2.html, оценка из 5, голосов 10
|