Donc j'essaie de créer un gestionnaire de signal en utilisant pthreads qui fonctionne à la fois sur OS X et Linux. Le code ci-dessous fonctionne sur OS X mais ne fonctionne pas sur Fedora 13.sigwait sous Linux (Fedora 13) vs OS X
L'application est assez simple. Il engendre un pthread, enregistre SIGHUP et attend un signal. Après avoir engendré le gestionnaire de signal, je bloque SIGHUP dans le thread principal, donc le signal ne doit être envoyé qu'au thread signalhandler.
Sur OS X cela fonctionne très bien, si je compile, exécute et envoie SIGHUP au processus, il imprime "Got SIGHUP". Sous Linux, il tue simplement le processus (et imprime Hangup). Si je commente le signal_handler pthread_create l'application ne meurt pas.
Je sais que l'application arrive au sigwait et bloque mais au lieu de retourner le code du signal, elle tue l'application.
je courais le test en utilisant les commandes suivantes:
g++ test.cc -lpthread -o test
./test &
PID="$!"
sleep 1
kill -1 "$PID"
test.cc
#include <pthread.h>
#include <signal.h>
#include <iostream>
using namespace std;
void *signal_handler(void *arg) {
int sig;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGHUP);
while (true) {
cout << "Wait for signal" << endl;
sigwait(&set, &sig);
if (sig == SIGHUP) {
cout << "Got SIGHUP" << endl;
}
}
}
int main() {
pthread_t handler;
sigset_t set;
// Create signal handler
pthread_create(&handler, NULL, signal_handler, NULL);
// Ignore SIGHUP in main thread
sigfillset(&set);
sigaddset(&set, SIGHUP);
pthread_sigmask(SIG_BLOCK, &set, NULL);
for (int i = 1; i < 5; i++) {
cout << "Sleeping..." << endl;
sleep(1);
}
pthread_join(handler, NULL);
return 0;
}
Fonctionne très bien, merci beaucoup pour la réponse! – Silas