Как понять, что pid() и new_pid имеют одинаковое значение при выполнении forktracker.stp?

Я использую forktracker.stp для отслеживания fork потока процесса. Скрипт такой:

probe kprocess.create
{
  printf("%-25s: %s (%d) created %d\n",
         ctime(gettimeofday_s()), execname(), pid(), new_pid)
}

probe kprocess.exec
{
  printf("%-25s: %s (%d) is exec'ing %s\n",
         ctime(gettimeofday_s()), execname(), pid(), filename)
}

Выполняя скрипт, я обнаружил, что он выводит следующие результаты:

......
Thu Oct 22 05:09:42 2015 : virt-manager (8713) created 8713
Thu Oct 22 05:09:42 2015 : virt-manager (8713) created 8713
Thu Oct 22 05:09:42 2015 : virt-manager (8713) created 8713
Thu Oct 22 05:09:43 2015 : virt-manager (8713) created 8713
......

Я не могу понять, почему pid() и new_pid имеют одно и то же значение. Я сомневаюсь, что это связано с «fork вызовите один раз, вернитесь дважды». Поэтому я пишу простую программу для тестирования:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    pid_t pid;

    pid = fork();
    if (pid < 0) {
        exit(1);
    } else if (pid > 0) {
        printf("Parent exits!\n");
        exit(0);
    }

    printf("hello world\n");
    return 0;
}

Отслеживая эту программу, скрипт выводит:

Thu Oct 22 05:27:10 2015 : bash (3855) created 8955
Thu Oct 22 05:27:10 2015 : bash (8955) is exec'ing "./test"
Thu Oct 22 05:27:10 2015 : test (8955) created 8956

Так что, похоже, это не связано с «fork вызовите один раз, вернитесь дважды».

Как я могу понять, что pid() и new_pid имеют одно и то же значение?


person Nan Xiao    schedule 22.10.2015    source источник


Ответы (1)


Я думаю, что вы видите просто новые потоки, где pid будут одинаковыми, а tids будут разными. Вы можете легко добавить tids в этот скрипт следующим образом:

probe kprocess.create {
  printf("%-25s: %s (%d:%d) created %d:%d\n",
         ctime(gettimeofday_s()), execname(), pid(), tid(), new_pid, new_tid)
}

probe kprocess.exec {
  printf("%-25s: %s (%d) is exec'ing %s\n",
         ctime(gettimeofday_s()), execname(), pid(), filename)
}

Вы также можете сообщить о tid в exec, но часто это менее интересно, поскольку exec все равно заменит весь процесс.

(Этот вопрос также был опубликован в списке рассылки, и я ответил здесь. .)

person Josh Stone    schedule 23.10.2015