2016-07-06 5 views
1

私のプログラムでは、スレッドAがスレッドAに定期的にSIGUSR1をスレッドBに送信すると予想していました。スレッドBでは、sigwaitにブロックされます。 SIGUSR1を受け取ったときの対応については、まだ定義していません。以下は私のコードです。ただし、プログラムはすぐに終了し、出力はUser defined signal 1です。pthreadシグナルが機能しません

void usr1_handler(); 

int main(int argc, char const *argv[]) 
{ 
    pthread_t tid; 
    pthread_attr_t attr_obj; 
    void *thread(void *); 

    pthread_attr_init(&attr_obj); 
    pthread_attr_setdetachstate(&attr_obj, PTHREAD_CREATE_DETACHED); 
    pthread_create(&tid, &attr_obj, thread, (void *)NULL); 

    while(1) 
    { 
    int ret = pthread_kill(tid, SIGUSR1); 
    sleep(5); 
    } 
    return 0; 
} 

void *thread(void *dummy) 
{ 
    int sig; 
    sigset_t sigmask;     
    struct sigaction action; 

    /* set up signal mask to block all in main thread */ 
    sigfillset(&sigmask); 
    pthread_sigmask(SIG_BLOCK, &sigmask, (sigset_t *)0); 

    for (;;) 
    { 
    int err = sigwait(&sigmask, &sig); 
     /* define what to do with sig here */ 
    printf("sig is %d\n", sig); 
    } 

    pthread_exit((void *)NULL); 
} 
+1

子スレッドがすべてのシグナルをブロックして 'sigwait()'に到達する前に、 'SIGUSR'シグナルが送出されている可能性があります。 –

+0

@AndrewHenleご返信ありがとうございます。しかし、最初の1つのシグナルが失われても、メインスレッドはwhile(1)ループでシグナルを永遠に送りますが、残りのシグナルはまだ届いていますか? – HuangJie

+0

@HuangJieこれが本当に起こったのであれば、最初の信号が送信された後にあなたのプログラムは既にクラッシュしていた –

答えて

0

あなたは間違っています。あなたは明示的にSIGUSR1をスレッドでブロック解除するように手配しますが、それは間違ったことです。一部のマニュアルは、それを明確に(例えばsigwait()のためのLinuxのmanページ)にするが、POSIX saysしません:

setによって定義された信号はsigwait()への呼び出し時のがブロックされていなければなりません。それ以外の場合、動作は未定義です。

(強調は追加。)

しかし、AndrewHenleの@と競合状態に関する2501年のコメント@見逃さないでください。あなたもそれを持っています。私は@ 2501に、それを解決するもっとも簡単な方法は、メインスレッドでシグナルマスクを設定して、それが他のものを継承することに同意します。しかし、他のスレッドを起動した後にメインスレッドのシグナルマスクを復元するのに失敗しないでください。そうしないと、プログラムを強制終了させるのが難しいかもしれません。

+0

関連:http://stackoverflow.com/questions/6326290/about-the-ambiguous-description-of-sigwait –

0

は現在、何も作成されたスレッドがそのシグナル処理を設定する前pthread_killを呼び出してからの主な機能を阻止されません。主な機能が呼び出される前にsigfillsetなどへの呼び出しが完了していることを確認してください:int err = sigwait(&sigmask, &sig);

すでにミューテックスと共有フラグ変数を使用し、pthreadsを使っているので:

最も簡単な解決策は、コールがpthread_createのために前に、mainに機能threadから、シグナル処理を移動することです。

関連する問題