Perché si chiama una funzione di libreria standard all'interno di un gestore di segnale scoraggiato?Chiamare una funzione di libreria standard nel gestore di segnale
risposta
Questo è spiegato nel GNU LibC documentation.
Se si chiama una funzione nel gestore, accertarsi che sia rientranza rispetto ai segnali, oppure assicurarsi che il segnale non possa interrompere una chiamata a una funzione correlata.
E nel caso, ecco il Wikipedia page sulle funzioni di rientro.
Un programma o una routine di computer è descritto come rientrante se può essere richiamato in modo sicuro prima che la sua precedente chiamata sia stata completata (vale a dire che può essere eseguita in modo sicuro contemporaneamente).
Perché la funzione di libreria potrebbe non essere rientrante.
Non solo i problemi di re-entrancy, a seconda del servizio dei servizi, si desidera anche evitare chiamate involontarie a malloc() (ad esempio asprintf()) e altre espansioni variadiche (ad esempio printf()).
è tutto funzionando benissimo e cose, fino a quando si esegue in alcuni bug misteriosi che sono totalmente perse le tracce :)
man 7 signal
vi darà un elenco di chiamate di sistema che sono sicuri per chiamare da un gestore di segnale. È descritto anche in POSIX.
Scoraggiato da chi? –
Scoraggiato, intendevo il suo comportamento indefinito. –
Ma, anche quando uso funzioni come printf(), il codice funziona bene ... –