1

私のアプリケーションには 2 つのスレッドがあります。各スレッドは、各ソケットを介してサーバーからデータを受け取ります。スレッドは epoll_wait() を返すのを待ちます。epoll_wait() が -1 を返し、errno が EINTR になることがあります。EINTR は、システム call() がシグナルによって中断されたことを意味します。EINTRを処理するために追加しました。しかし、どんなシグナルが届いたのか、なぜシグナルが届いたのかはわかりません。かな。

方法 1.

スレッドを作成しました。

sigset_t sMaskOfSignal;                                               
sigset_t sOldMaskOfSignal;                                            
sigfillset(&sMaskOfSignal);                                           
sigprocmask(SIG_UNBLOCK, &sMaskOfSignal, &sOldMaskOfSignal)

while(1)
{                                                                                        
    sigwait(&sMaskOfSignal, &sArrivedSignal);                                            

    fprintf(stdout, "%d(%s) signal caught\n", sArrivedSignal, strsignal(sArrivedSignal));
}                                                                                        

epoll_wait() が中断されたときにシグナルをキャッチできませんでした。

方法 2

アプリケーションを strace ツールで実行すると、epoll_wait() が中断されることはありません。

私の問題は GDB ツールで非常によく再現されています。助けが必要です....

4

2 に答える 2

0

すべてのシグナルをキャッチするためにシグナルハンドラを設定し、シグナルフラグを SA_SIGINFO に設定してみてください。

このようなもの

struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = <handler>;

sigaction(SIGFPE, &act, 0);
sigaction(SIGHUP, &act, 0);
sigaction(SIGABRT, &act, 0);
sigaction(SIGILL, &act, 0);
sigaction(SIGALRM, &act, 0);
sigaction(SIGALRM, &act, 0);
.
.
.

//and your handler looks like

void handle_sig (int sig, siginfo_t *info, void *ptr)
{
     printf ("Signal is %d\n",sig);
}

メインプログラムにハンドラーを登録し、epoll で EINTR を無視します。

于 2013-08-26T09:13:14.070 に答える