2010-07-20 4 views

Antwort

9

Sie können in /proc/<PID>/task/ suchen (<PID> ist eine Prozess-ID), die eine Anzahl von Unterverzeichnissen haben wird, jedes mit dem Namen gleich der Thread-ID eines der Threads in dieser Aufgabe.

Beachten Sie, dass dies nur eine Art von Echtzeit ist - es sei denn, Sie sollten das gesamte System für die Dauer "einfrieren", können die Informationen immer schal sein, weil ein Prozess sogar Threads erstellen oder zerstören kann wie Sie die Daten betrachten.

3

Ich denke, ps -L sollte den Trick tun.

Hier ist ps .

Nicht sicher, ob Sie fragen, wie das programmatisch zu tun, aber in diesem Fall, da ps Open-Source ist, so können Sie wahrscheinlich einen Blick auf die Quellen.

+0

ja programmaticaly –

+0

Nicht sicher in welcher Sprache ich so implementieren werde. –

+0

Ich bin mir sicher, dass jede Sprache, die Sie implementieren, 'ps' aufrufen kann. – corsiKa

4

In modernen Linux sind Threads Prozessen sehr ähnlich. Jeder Thread hat eine LWP-Kennung ("Lightweight Process"), die intern als PID implementiert ist. Wenn jedoch ein solcher "leichtgewichtiger Prozess" (d. H. Ein Thread) für eine PID abgefragt wird, liefert das System die PID des Prozesses, der den Thread erzeugt hat (anstelle von LWP). Beachten Sie auch, dass LWP gleich der PID ist, wenn der Prozess nur einen Thread hat.

ps fähig ist, Fäden mit -L Modifikator auf die Verarbeitung, wie in seinem ereOnanswer beschrieben. Aber ich sollte beachten, dass ps nicht nur für den manuellen Aufruf ist. Es verfügt über Funktionen, um die Ausgabe so zu drucken, dass sie leicht von einem anderen Programm analysiert werden kann.

Der folgende Befehl druckt LWPs (-o lwp=) und PIDs (-o pid=) alle (-A) Gewinde (-L) im System. Jeder String stellt einen Thread, zweite Spalte ist der Prozess, der es hervorgebracht:

$ 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 

Ganz einfach mit C oder C++ zu analysieren, ist es nicht? Um dies aus Ihrem Programm zu lesen, können Sie popen oder einen der C++ equivalents verwenden.

Beachten Sie, dass die Verwendung von ps nicht nur einfacher ist als das Lesen /proc. Es ist auch viel sicherer, als das /proc Dateisystem manuell zu analysieren. ps ist ein POSIX-Befehl *, es funktioniert garantiert; Es verwendet /proc unter Linux, aber das sind interne Details. Wenn sich die zugrundeliegende Infrastruktur ändert, wird ps umgeschrieben und funktioniert weiter, während Ihr Code, wenn er auf Basis von /proc geschrieben wird, bricht.


* Um ehrlich zu sein, POSIX nicht -L Schalter nicht angeben. Aber in jedem Linux, das über GNU-Toolchain verfügt, wird es verfügbar sein.

Verwandte Themen