18
Июл
2017

Сигналы в Linux: послать сигнал потоку. Проблема: поток не завершается

Задача: есть процесс. от него создается 2 потока. Через n секунд послать сигнал, по которому должен завершиться один из потоков. Этот поток не завершается.

Мой код выглядит так и я не могу понять в чем ошибка?

#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <pthread.h> 
#include <time.h> 

static void handler( int signo, siginfo_t* info, void* context ) 
{ 
   printf( "\nSig coming: sig=%d; tid=%lu\n", signo, pthread_self() ); 
}; 

void* threadfuncWithSignalSigUSr1 ( void* data ) 
{ 
   sigset_t localsig;
   if (sigemptyset(&localsig))
    perror( "threadfuncWithSignalSigUSr1 error" ); 
   if (sigprocmask( SIG_BLOCK, &localsig, NULL ))
    perror( "threadfuncWithSignalSigUSr1 error" ); 
   printf( "threadfuncWithSignalSigUSr1 pause\n");
   pause();
   printf( "threadfuncWithSignalSigUSr1 end\n");     
   return NULL; 
};
void* threadfunc( void* data ) 
{ 
   sigset_t localsig;
   if (sigfillset(&localsig))
    perror( "threadfunc error" );
   if (sigprocmask( SIG_BLOCK, &localsig, NULL ))
    perror( "threadfunc error" );
   printf( "threadfunc pause\n");
   pause();
   printf( "threadfunc end\n" );   
   return NULL; 
};

int main() 
{   
   sigset_t sig;   
   const int thrnum = 2;

   if (sigemptyset(&sig))
    perror( "main error" );
   if (sigprocmask( SIG_BLOCK, &sig, NULL ))
    perror( "main error" );

   printf("main + %d threads : waiting fot signal %d; pid=%d; tid(main)=%lu\n", thrnum, SIGUSR1, getpid(), pthread_self() ); 

   struct sigaction act; 
   act.sa_mask = sig; 
   act.sa_sigaction = handler; 
   act.sa_flags = SA_SIGINFO; 
   if( sigaction( SIGUSR1, &act, NULL ) < 0 ) 
    perror( "set signal handler error " ); 

   pthread_t pthr; 
   pthread_create( &pthr, NULL, threadfuncWithSignalSigUSr1, NULL ); 
   pthread_create( &pthr, NULL, threadfunc, NULL );

   int sec = 1;
   while (sec < 4)
   {
    printf("sec: %d\n", sec);
    sleep(1);
    sec++;  
   }

   kill(getpid(), SIGUSR1);

   while (1)
   {}

}; 

Источник: https://ru.stackoverflow.com/questions/693536/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B-%D0%B2-linux-%D0%BF%D0%BE%D1%81%D0%BB%D0%B0%D1%82%D1%8C-%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D1%83-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA-%D0%BD%D0%B5-%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B0%D0%B5%D1%82%D1%81%D1%8F

Share

Тебе может это понравится...