Le mie domande sono:Determinare se una funzione è async-signal-safe (può essere chiamato all'interno di un gestore di segnale)
- c'è un modo per stabilire in modo definitivo se una funzione è async-signal-safe se si non hai accesso alla sua implementazione?
- In caso contrario, c'è un modo per testare se la funzione sarebbe sufficientemente sicura per il segnale asincrono da chiamare da un gestore di segnale?
Se si legge la pagine man di segnale() o sigaction(), si ottiene una lista di funzioni async-signal-safe (funzioni che possono essere chiamate in modo sicuro all'interno di un gestore di segnale). Tuttavia, ritengo che questa lista non sia esaustiva. Ad esempio, la pagina seguente http://linux.die.net/man/7/signal, sotto le funzioni Async-segnale-safe intestazione, si legge:
POSIX.1-2004 (noto anche come POSIX.1-2001 rettifica tecnica 2) richiede un'attuazione garantire che le seguenti funzioni possano essere tranquillamente richiamate all'interno di un gestore di segnale:
E quindi procede ad elencare le normali funzioni di sicurezza del segnale asincrono elencate nelle pagine di manuale sopra. Mentre lo leggo, dice "richiede", non "questi sono gli unici".
Ad esempio, this site dice che back_trace_symbols_fd() è sicuro per segnale asincrono. Questa funzione ottiene i dati da dladdr() e non usa malloc() come back_trace_symbols(), quindi sembra che sia sicuro. Inoltre, ho fatto alcuni test e la struttura di output di dladdr() contiene le variabili char *, ma queste non sono mallocizzate in fase di runtime. La stringa di caratteri a cui puntano esiste in fase di esecuzione ancor prima che venga chiamato dladdr().
Ogni pensiero o idea che possa indirizzarmi nella giusta direzione è apprezzato.
Non dimenticare di votare le risposte utili alle tue domande o di accettare la risposta più utile a ciascuna delle tue domande. Se non sei sicuro, guarda [FAQ] (http://stackoverflow.com/faq) e soprattutto [Come faccio a porre domande qui?] (Http://stackoverflow.com/faq#howtoask) –