2015-10-30 14 views
10

Nach proc Handbuch:Wie versteht man "/ proc/[pid]/stack"?

/proc/[pid]/Stapel (seit Linux 2.6.29)

Diese Datei eine symbolische Spur der Funktion liefert ruft in diesen Kernel-Stack des Prozesses. Diese Datei wird nur bereitgestellt, wenn der Kernel mit der CONFIG_STACKTRACE-Konfiguration Option erstellt wurde.

Also schreibe ich ein Programm zu testen:

#include <stdio.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <pthread.h> 

void *thread_func(void *p_arg) 
{ 
     pid_t pid = fork(); 
     if (pid > 0) { 
      wait(NULL); 
      return 0; 
     } else if (pid == 0) { 
      sleep(1000); 
      return 0; 
     } 
     return NULL; 
} 
int main(void) 
{ 
     pthread_t t1, t2; 

     pthread_create(&t1, NULL, thread_func, "Thread 1"); 
     pthread_create(&t2, NULL, thread_func, "Thread 2"); 

     sleep(1000); 
     return 0; 
} 

Nach dem Ausführen pstack verwenden, um die Fäden des Fortschritts zu überprüfen:

linux-uibj:~ # pstack 24976 
Thread 3 (Thread 0x7fd6e4ed5700 (LWP 24977)): 
#0 0x00007fd6e528d3f4 in wait() from /lib64/libpthread.so.0 
#1 0x0000000000400744 in thread_func() 
#2 0x00007fd6e52860a4 in start_thread() from /lib64/libpthread.so.0 
#3 0x00007fd6e4fbb7fd in clone() from /lib64/libc.so.6 
Thread 2 (Thread 0x7fd6e46d4700 (LWP 24978)): 
#0 0x00007fd6e528d3f4 in wait() from /lib64/libpthread.so.0 
#1 0x0000000000400744 in thread_func() 
#2 0x00007fd6e52860a4 in start_thread() from /lib64/libpthread.so.0 
#3 0x00007fd6e4fbb7fd in clone() from /lib64/libc.so.6 
Thread 1 (Thread 0x7fd6e569f700 (LWP 24976)): 
#0 0x00007fd6e4f8d6cd in nanosleep() from /lib64/libc.so.6 
#1 0x00007fd6e4f8d564 in sleep() from /lib64/libc.so.6 
#2 0x00000000004007b1 in main() 

Zur gleichen Zeit, überprüfen /proc/24976/stack:

linux-uibj:~ # cat /proc/24976/stack 
[<ffffffff804ba1a7>] system_call_fastpath+0x16/0x1b 
[<00007fd6e4f8d6cd>] 0x7fd6e4f8d6cd 
[<ffffffffffffffff>] 0xffffffffffffffff 

Die 24976 Verfahren hat 3 Fäden, und sie alle Block auf Systemaufruf (nanosleep und wait), so dass alle Fäden 3 jetzt in kernel Raum arbeiten, und sich in Kernel-Threads jetzt, nicht wahr? Wenn dies der Fall ist, sollten 3 Stapel in der Datei /proc/[pid]/stack vorhanden sein. Aber es scheint, dass es nur 1 Stapel in /proc/[pid]/stack Datei gibt.

Wie soll ich verstehen /proc/[pid]/stack?

Antwort

5

Wie soll ich verstehen /proc/[pid]/stack?

von den man Seiten Genommen für proc:

Es gibt zusätzliche hilfreiche Pseudostrecken:

[stack] Der anfängliche Prozess des Stapels (auch als der Haupt-Thread die bekannt).

darunter Just, können Sie finden:

[stack: [tid]] (seit Linux 3.4)

Ein Stapel des Threads (wo die [tid] ist eine Thread-ID) . Es entspricht dem/proc/[pid]/task/[tid]/Pfad.

Was scheint zu sein, was Sie suchen.

+3

Nach Ihren Tipps, bekomme ich die Antwort: Unter Linux ist Thread eigentlich ein Prozess, also '/ proc/[tid]/stack' wird die Kernel-Stack-Informationen des Threads bekommen, oder'/proc/[pid]/Aufgabe/[tid]/Stapel ". –

Verwandte Themen