2016-10-26 10 views
0

私はSIGALRMとSIGPOLLシグナルの両方を非同期で処理しなければなりません。私は次のことを考え出した。私はこれが複数の信号を非同期的に扱う正しい方法であるかどうかはわかりません。SIGALRMとSIGPOLLを非同期モードで使用するには?

void handle_alarm(int sig) {  
printf("Timeout!\n"); 
printf("?\n"); 
} 


struct sigaction sa;  
sigemptyset(&sa.sa_mask); 
sigaddset(&sa.sa_mask, SIGPOLL); 
sigaddset(&sa.sa_mask, SIGALRM); 
sa.sa_handler = &handle_alarm; 
//sa.sa_handler = &handle_sigpoll; 
sa.sa_flags = 0; 
if (sigaction(SIGPOLL, &sa, 0) == -1) { 
    perror(0); 
    printf("here\n"); 
    exit(1); 
}  
if (sigaction(SIGALRM, &sa, 0) == -1) { 
    perror(0); 
    printf("here\n"); 
    exit(1); 
} 

// Setup UDP Socket 
sock_id = socket(AF_INET, SOCK_DGRAM, 0);     
if(sock_id<0) 
    perror("Error opening Socket\n"); 

fcntl(sock_id,F_SETOWN,getpid()); 
fcntl(sock_id, F_SETFL, FASYNC); 

alarm(7); 

コードを改善するにはどうすればよいですか?私の質問の詳細を簡潔にして申し訳ありません。

+1

信号よりも「選択」のほうが良いでしょう。 – zwol

答えて

0

シグナルハンドラ関数内でスレッドを作成し、pthread_detachを使用してpthread_joinを使用せずにスレッドを閉じることができます。

+1

'pthread_create'は非同期シグナルセーフではありません。さらに多くの追加予防策を講じなければ、クラッシュやデッドロックが発生する可能性があります。 – zwol

関連する問題