Frage

Ich verwende sigprocmask wie folgt:

void mask(){
    sigset_t new_set,old_set;
    sigemptyset(&new_set);
    sigaddset(&new_set,SIGALRM);
    sigprocmask(SIG_BLOCK, &new_set, &old_set);
}

und zu meiner Überraschung eine Funktion, die eine große Liste druckt irgendwie durch das Signal unterbrochen wird, obwohl ich () am Anfang Maske aufrufen. Es sieht aus, als ob Maske fehlschlägt, da meine Funktion keine anderen Funktionen nicht aufrufen und daher nirgends in seinen Lauf sollte ein unmask () geschehen. Was kann dazu führen, sigprocmask zum Scheitern verurteilt?

War es hilfreich?

Lösung

Von der POSIX-Spezifikation , sigprocmask() -1 zurück und setzt errno accoringly wenn es fehlschlägt. Wenn der Code, dass Sie den Code geschrieben ist, dass Sie verwenden, offensichtlich Sie überprüfen nicht, ob es gelungen ist.

Wenn sigprocmask() erfolgreich ist, und es ist in der Tat SIGALRM, dass die Funktion zu unterbrechen, die mask() rufen, gibt es eine sehr gute Chance, dass etwas in dieser Funktion dieses Signals ist der Umgang anders.

Das anderes, was Sie tun können, ist raise(SIGALRM) unmittelbar nach mask() Aufruf, wenn sie ignoriert, dann eine andere Funktion unter dem das Verhalten ändert.

Wie bmargulies in den Kommentaren darauf hingewiesen (das wahrscheinlich eine Antwort hätte sein sollen), können Sie strace verwenden können, um zu sehen, ob das in der Tat der Fall ist, gekoppelt mit ltrace ggf. es durch Bibilotheksaufrufe Schritt zu beobachten.

Das ist überhaupt nicht ungewöhnlich, wenn Sie mit Bibliotheken arbeiten, die unhöflich sind, wenn es darum geht, Handler Installation (z überprüfen, ob ein Signal ignoriert wird, oder an anderer Stelle vor behandelt, um das Verhalten zu ändern).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top