我正在开发一个将在嵌入式 ARM Linux 上运行的软件。它使用 Posix 线程并且在为我的计算机编译时运行良好。但是一旦我交叉编译它,我就会看到奇怪的线程问题:
分离的线程和连接的线程在返回时不会退出。我仍然可以在进程列表中看到它们。它们只有在主线程退出时才会消失。
信号以一种奇怪的方式处理。我知道信号在线程中可能很棘手,所以我将它们全部阻止,只允许它们在正确处理它们的线程中。但是在我的 ARM 机器上,这个线程无法捕捉到任何信号。
这个 ARM 盒子里的系统已经过时了,它使用 Linux 2.6.9,我的工具链是 GCC 3.3.2。有人知道此类系统上 Posix 线程的某种限制吗?
这是我处理信号的一些代码:
/**
* Thread that just waits for signals to catch
*/
static void *signals(void *arg) {
sigset_t *set = (sigset_t *) arg;
int sig;
if (pthread_sigmask(SIG_UNBLOCK, set, NULL))
warnx("Cannot unblock signals");
while (program_should_continue()) {
/* wait for a signal */
if (sigwait(set, &sig))
warnx("Could not handle signal");
switch (sig) {
/* Do stuff */
}
}
return NULL;
}
线程的创建:
int main(int argc, char **argv) {
/* set the signals to be bocked for threads */
sigemptyset(&sigset);
sigaddset(&sigset, SIGQUIT);
sigaddset(&sigset, SIGTERM);
sigaddset(&sigset, SIGINT);
sigaddset(&sigset, SIGALRM);
if (pthread_sigmask(SIG_BLOCK, &sigset, NULL))
errx(EXIT_FAILURE, "Cannot block signals for new threads");
/* set attributes for detached threads */
pthread_attr_init(&detached_attr);
pthread_attr_setdetachstate(&detached_attr, PTHREAD_CREATE_DETACHED);
/* create signal thread */
if (pthread_create(&pth_signals, &detached_attr, signals, (void*) &sigset)) {
errx(EXIT_FAILURE, "Cannot create thread signals");
} else {
if (pthread_setname(pth_signals, "signals"))
warnx("Cannot set thread name");
}
}