2010-11-08 4 views
5

sto chiedendo su Linux con i recenti glibc.Linux: rilevare in fase di esecuzione che un processo ha più thread

C'è un modo per rilevare che il processo consiste di 1 thread o di più thread?

I thread possono essere creati da pthread o clone nudo(), quindi ho bisogno di qualcosa di piuttosto universale.

UPD: Voglio rilevare i thread del processo corrente da esso stesso.

+0

Entro il proprio programma o esternamente? – Duck

+0

Anatra, nel mio programma. – osgx

+0

Devo chiedere: perché non lo sai già? Una biblioteca o qualcosa di simile li apre sotto le coperte? – Duck

risposta

11

Verificare se directory/proc/YOUR_PID/task/contiene solo una sottodirectory. Se hai più di una discussione in corso ci saranno diversi sottodiretti.

Il conteggio collegamento reale può essere utilizzato per contare le sottodirectory. Questa funzione restituisce il numero corrente di thread:

#include <sys/stat.h> 

int n_threads(void) 
{ 
    struct stat task_stat; 

    if (stat("/proc/self/task", &task_stat)) 
     return -1; 

    return task_stat.st_nlink - 2; 
} 
+0

Hmm ... Sì. Ci sono thread per alcuni processi. Ma per ottenere informazioni da/proc ho bisogno di un sacco di syscalls: opendir/readdir. C'è un modo più semplice? – osgx

+1

@osgx: È possibile farlo con una chiamata di sistema - solo 'stat ("/ proc/self/compito")' e verificare se 'st_nlink> 3'. – caf

+0

caf, Grazie, ma il procfs mantiene il conteggio dei link inode per le directory? Controlli questo metodo? – osgx

0

Suppongo che si possa correre 'ps' (via popen() o simili) e analizzare la sua uscita, e vedere quante volte l'identificativo del tuo processo (come restituito dal getpid()) appare nell'output. Potrebbe esserci un modo migliore, ma è quello che viene in mente per la prima volta.

+0

NO, per favore, nessun sottoprocesso che inizia :). È così lento, e ho bisogno di un modo veloce, come 1 syscall o qualche indicatore di lettura o così .. – osgx

0

/proc è il modo standard di fare questo in Linux. Strumenti come 'ps' funzionano attraverso/proc. In Linux 2.6, è possibile trovare il numero di thread in/proc/self/stat, ma questo non è retrocompatibile.

0

La risposta di Victor è sicuramente la più veloce, anche se potresti voler prendere in considerazione l'utilizzo della libreria ps.

La denominazione di Ubuntu è libprocps3-dev in modo da utilizzare installarlo utilizzando:

sudo apt-get install libprocps3-dev 

Le intestazioni si trovano sotto /usr/include/proc.

Nota che biblioteche le opere di lettura/proc. Quindi equivale a leggere i file di interesse direttamente, solo che conoscerà le differenze tra le varie versioni e si prenderà cura di ciò che è sotto il cofano per te.

Vedere http://procps.sourceforge.net/index.html per dettagli.

+0

Quante chiamate di sistema faranno procps per rispondere alla domanda "processo costituito da 1 thread o di più di 1 discussione"? – osgx

+1

Nella risposta principale, vedo che molte persone chiedono del problema di compatibilità. procps è decisamente lento, ma dovrebbe funzionare in modo trasparente sulle versioni più recenti e meno recenti di Linux. Dipende se hai bisogno di velocità o compatibilità a lungo termine. –