2015-10-22 1 views
1

Я использую forktracker.stp для отслеживания потока процесса fork. Сценарий таков:Как понять, что pid() и new_pid имеют одинаковое значение при выполнении forktracker.stp?

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 - это то же значение?

ответ

1

Я думаю, что вы видите просто новые потоки, где pids будут одинаковыми, в то время как тили будут отличаться. Вы можете легко добавить ПИВ в этот сценарий следующим образом:

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 будет в любом случае заменить весь процесс.

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