0

私が書いているプロファイラーで Linux ptrace API を使用しています。

私の疑似 C コードは次のようになります。

setjmp();
measure();
alarm(N);
while(1) {
    waitpid(child, &status, WNOHANG);
    if(child_process_exiting) {
        measure();
        break;
    }
}

アラーム シグナル ハンドラは次のとおりです。

void sig_handler(int sig) {
     signal(SIGALRM, sig_handler);
     longjmp(env, 0);
 }

子プロセスが終了してループを抜けるまで繰り返し setjmp 呼び出しに戻りたい。目標は、子プロセスが終了するまで N 秒ごとに測定関数を実行することです。

4

2 に答える 2

3

Nほんの数秒だけスリープしてから、measure電話をかけてみませんか?SIGCHLD子プロセスが終了したときにキャッチするハンドラーをインストールすると、たとえばsleep、中断されて残りの秒数が返されます。

何かのようなもの

signal(SIGCHLD, sigchld_handler);

do
{
    measure();
} while (sleep(N) == 0);

waitpid(...);
于 2013-07-25T13:44:49.480 に答える
0

私はこれを変更する必要があるだけだと思います:

setjmp(env);// env は jum_buf 値です

それで

longjmp(env,1);// so if necessary, we can use :int flag = setjum(env); 

フラグ == 1 の場合。私はコードが sig_handler を呼び出して戻ってくることを知っています。

于 2013-07-25T13:43:41.287 に答える