Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Вопрос специалистам по PTHREAD-ам   Vakhrushev Andrew   31 Aug 2001 08:43:36 
 Re: Вопрос специалистам по PTHREAD-ам   Dmitriy Kyrhlarov   31 Aug 2001 11:27:49 
Архивное /ru.unix.bsd/6488677846b2.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional