1

SIGINTプログラムを中断できるようにフックしたマルチスレッド (pthreads) アプリケーションがあります。次のようにシグナルハンドラスレッドを設定しました。

    /*** startup code ***/
// Prep signal-related stuff:
signal(SIGPIPE, SIG_IGN);

sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
assert(0 == pthread_sigmask(SIG_BLOCK, &set, NULL));

// Spawn signal handling thread
pthread_t sig_pthread;
pthread_create(&sig_pthread, NULL, &sig_thread, (void *) &set);

シグナル ハンドラ スレッドは次のとおりです。

static void* sig_thread(void *arg) {
    sigset_t *set = (sigset_t *) arg;
    int s, sig;

#ifndef __APPLE__
    prctl(PR_SET_NAME, "signal hander", 0, 0, 0);
#endif

    for (;;) {
        s = sigwait(set, &sig);
        if (s != 0) {
            ERR(E_UNKNOWN, "sigwait failed?\n");
            /* ERR is macro -> exit(E_UNKNOWN) */
        }

        if (sig == SIGINT) {
            ...
        } else {
            ERR(E_UNKNOWN, "caught unknown signal %d\n", sig);
            /* ERR is macro -> exit(E_UNKNOWN) */
        }
    }
}

正常に実行されている場合、コードは期待どおりに機能します。ただし、gdb でプログラムを実行すると、次のようになります。

--- E: caught unknown signal 4611

(10 進数の) 値 4611 (0x1203, 01103) について洞察を持っている人はいますか? では明らかなことではありませんでしたsignal.h。これを引き起こすためにgdbが何をしているのか、そしてそれを修正/防止する方法を知っている人はいますか?

4

1 に答える 1

1

を呼び出す前に4611初期化しないため、 はゴミであると思われます。sigsigwait()

sigあなたが示したソースから、エラーの場合のテストをスキップしていないようです( s != 0)。

コードを次のように変更したい場合があります。

#include <stdio.h>    
#include <signal.h>
...

#define E_UNKNOWN "E"
#define ERR(ec, fmt, ...) (fprintf(stderr, "--- %s: " fmt, (ec), __VA_ARGS__))

...

  for (;;) {
    int sig = 0;
    int s = sigwait(set, &sig);

    if (s != 0) {
        ERR(E_UNKNOWN, "sigwait() failed with %d.\n", s);
    }
    else {
      if (sig == SIGINT) {
          ...
      } else {
        ERR(E_UNKNOWN, "Caught unhandled signal %d.\n", sig);
      }
    }
    ...
于 2013-06-18T06:13:30.210 に答える