1

プロセス フローを追跡するために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したがって、「 1回呼び出して2回返す 」とは関係ないようです。

pid()new_pidが同じ値であることをどのように理解できますか?

4

1 に答える 1

1

あなたが見ているのは単に新しいスレッドだと思います。pid は同じですが、tid は異なります。次のように、そのスクリプトに tid を簡単に追加できます。

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

exec で tid を報告することもできますが、いずれにせよ exec がプロセス全体を置き換えるため、あまり面白くありません。

(この質問はメーリングリストにも投稿されていたので、ここに返信しました。)

于 2015-10-23T00:52:58.140 に答える