2009-12-18 14 views
6

Devo trovare il numero di segnali in attesa nella coda di segnale di un thread in linux. C'è qualche API fornita da Linux?come determinare il numero di segnali in sospeso nella coda del segnale unix (Linux)

Questa API deve essere chiamata da thread, diverso dal thread su cui stiamo eseguendo la query.

sigpending fornisce l'API per il thread chiamante. C'è qualche API, che prende l'id del thread come arg e fornisce alcune informazioni sui segnali in sospeso nella coda.

Qualsiasi aiuto è apprezzato.

risposta

3

Non sono a conoscenza di tale API ma qui è una soluzione alternativa: scrivere una piccola libreria che racchiuda il codice del segnale. Quando invii un segnale, aumenta un contatore atomico. Mentre elabori i segnali, decrementa nuovamente il contatore. Quindi, puoi usare questo contatore atomico per rispondere alla tua curiosità.

[EDIT] Se ciò non è sufficiente, allora si ha la fonte: basta esaminare il codice e le strutture dati coinvolte e utilizzare ciò che è necessario per esaminare le strutture del kernel. Ma questo potrebbe comportare la scrittura di un modulo (perché le strutture dati del kernel non sono leggibili da un processo) più il tuo codice diventerà dipendente dal kernel su cui è stato compilato. Quindi sconsiglio questo approccio.

+2

Questo è quello che ho visto di più fare per trovare segnali RT in attesa (non serviti). Altri sono semplicemente combinati (per tipo) dal kernel in ogni caso, il che può essere degno di nota. 10.000 SIGUSR1 vengono consegnati come 1. –

6

sigpending() restituisce l'insieme di segnali in attesa di consegna per un thread. Puoi scorrere su quel sigset_t e usare sigismember() per verificare l'appartenenza.

Tradizionalmente, UNIX non mette in coda più di un'istanza di un segnale (in questo senso, continuano ad essere "inaffidabili"). A volte è possibile ottenere questo effetto con segnali in tempo reale.

Su Linux, read() da un signalfd consentirà di leggere più di un'istanza di un segnale in una volta, nel caso in cui vengano accodati.

Problemi correlati