Domanda

sto usando sigprocmask come segue:

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

e con mia sorpresa una funzione che consente di stampare una grande lista in qualche modo viene interrotto dal segnale, anche se invoco maschera () al suo inizio. Sembra come se la maschera viene a mancare, dal momento che la mia funzione non si richiama ad altre funzioni e, pertanto, nessuna parte nella sua corsa dovrebbe un Unmask () accadere. Che cosa può causare sigprocmask a fallire?

È stato utile?

Soluzione

POSIX spec , sigprocmask() restituisce -1 e imposta errno accoringly se fallisce. Se il codice che hai postato è il codice che si sta utilizzando, ovviamente non sta verificando per vedere se è riuscito.

Se sigprocmask() è successo, ed è davvero SIGALRM che sta interrompendo la funzione che chiama mask(), c'è un molto buona probabilità che qualcosa all'interno di tale funzione è la gestione che il segnale in modo diverso.

L'altra cosa che puoi fare è raise(SIGALRM) subito dopo aver chiamato mask(), se ignorati, poi qualche altra funzione qui sotto che sta cambiando il comportamento.

bmargulies annotato nei commenti (che, probabilmente, avrebbe dovuto essere una risposta), è possibile utilizzare strace per vedere se questo è infatti il ??caso, accoppiato con ltrace eventualmente guardarlo scorrere chiamate di libreria.

Questo non è affatto raro quando si lavora con le librerie che sono scortese quando si tratta di installare i gestori (ad esempio il controllo per vedere se un segnale viene ignorato, o manipolato altrove prima di modificare il comportamento).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top