Как понимать "/proc/[pid]/stack"?

Согласно руководству proc:

/proc/[pid]/stack (начиная с Linux 2.6.29)

Этот файл предоставляет символическую трассу вызовов функций в               этот стек ядра процесса. Этот файл предоставляется только в том случае, если               ядро было построено с конфигурацией CONFIG_STACKTRACE               вариант.

Итак, я пишу программу для тестирования:

#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;
}

После запуска используйте pstack для проверки потоков прогресса:

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 ()

В то же время проверьте /proc/24976/stack:

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

В процессе 24976 есть потоки 3, и все они блокируются при системном вызове (nanosleep и wait), поэтому все потоки 3 теперь работают в пространстве kernel и превращаются в потоки ядра теперь, правильно? Если это так, в файле /proc/[pid]/stack должно быть 3 стеков. Но, кажется, существует только 1 стек в /proc/[pid]/stack файле.

Как я должен понимать /proc/[pid]/stack?

Ответ 1

Как я должен понимать /proc/[pid]/stack?

Снято с man для proc:

Есть дополнительные полезные псевдо-пути:

[стека] Начальный процесс (также известный как основной поток).

Ниже этого можно найти:

[stack: [tid]] (начиная с Linux 3.4)

Стек потока (где [tid] - идентификатор потока). Он соответствует /proc/ [pid]/task/[tid]/path.

Кажется, что вы ищете.