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
?
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 ". –