2010-07-20 10 views

risposta

9

È possibile cercare in /proc/<PID>/task/ (dove <PID> è un ID di processo) che avrà un numero di sottodirectory, ciascuna con il nome uguale all'ID thread di uno dei thread in tale attività.

Si noti che questo è solo in ordine di tempo reale - a meno che non si debba "congelare" l'intero sistema per la durata, le informazioni ottenute possono sempre essere obsolete, perché un processo può creare o distruggere thread anche mentre stai guardando i dati.

3

Immagino che ps -L dovrebbe fare il trucco.

Qui è ps .

Non so se chiedi come farlo a livello di programmazione, ma in questo caso, dal momento che ps è open-source, puoi probabilmente dare un'occhiata alle fonti.

+0

sì programmatio –

+0

Non sicuro in quale lingua ho intenzione di implementarlo. –

+0

Sono sicuro che qualsiasi linguaggio implementato sarà in grado di chiamare 'ps'. – corsiKa

4

Nei Linux moderni, i thread sono molto simili ai processi. Ogni thread ha un identificatore LWP ("processo leggero"), che è implementato internamente come PID. Tuttavia, se tale "processo leggero" (cioè il thread) viene interrogato per un PID, il sistema produce il PID del processo che ha generato il thread (invece di LWP). Nota anche che se il processo ha solo un thread, il suo LWP sarà uguale al suo PID.

ps è in grado di elaborare le discussioni con -L modificatore, come descritto nel suo ereOnanswer. Ma devo notare che ps non è solo per invocazione manuale. Ha capacità di stampare l'output in modo tale da essere facilmente analizzato da un altro programma.

Il comando seguente stamperà processi leggeri (-o lwp=) e PID (-o pid=) di tutti (-A) Fili (-L) nel sistema. Ogni stringa rappresenta un filo, seconda colonna essendo il processo che ha generato esso:

$ ps -A -L -o lwp= -o pid= 
... 
27747 27747 
27749 27749 
27750 27750 
27751 27750 
27752 27750 
27755 27750 
27756 27750 
27772 27772 
27858 27858 
30457 30457 
30886 30886 

abbastanza facile da analizzare con C o C++, non è vero? Per leggerlo dal tuo programma, puoi usare popen o uno dei suoi C++ equivalents.

Si noti che l'utilizzo di ps non è solo più facile della lettura di /proc. È anche molto più sicuro del parsing del file system /proc. ps è un comando POSIX *, è garantito che funzioni; usa /proc sotto Linux, ma sono i dettagli interni. Al variare dell'infrastruttura sottostante, ps verrà riscritto e continuerà a funzionare, mentre il codice, se scritto in base a /proc, si interromperà.


* Per essere onesti, POSIX non specifica -L interruttore. Ma in qualsiasi Linux, che abbia GNU toolchain, sarà disponibile.

Problemi correlati