0

新しいプロセスをフォークするコードを作成しようとしていますが、時間がかかりすぎる場合は、しばらくしてからその新しいプロセスを強制終了します。このコードは、時間制限なしで正常に動作しexecve、問題なく実行されますが、コードの先頭 4 行を挿入しcatて execve を呼び出そうとすると、アラームの呼び出しによっておそらく子供が殺されます。

このsignal場合、呼び出しはまったく何もしていないようです。多数のトレースを入れましたkillprocが、呼び出されていません。このタイミング システムを間違って設定するにはどうすればよいですか?

void killproc(int sig) {
    printf("running?");
}

コード: (子)

if(MAX_TIME != -1){
    signal(SIGALRM, killproc);
    alarm(MAX_TIME);
}
// Process we are timing
int ret = execve(path, newargv, envp);
4

1 に答える 1

3

printfシグナルハンドラでは安全ではありません。信号が間違った時間に配信されると、内部構造が無効になり、不正printfなポインタをたどってクラッシュします。これを他の操作でテストしましたか?クラッシュしなくても、出力をフラッシュしたり、改行を印刷したりしていないので、「実行中ですか?」おそらくstdioバッファでスタックします。

さらに、signal()廃止されました。使用したいsigaction()。(のマンページにsigactionは、シグナルハンドラで安全に使用できるインターフェイスも記載する必要があります。)

とはいえ、どちらも本当の問題ではありません。問題は、シグナルハンドラーを設定していて、それがexec()。ただし、シグナルハンドラを含むexec()プロセスのアドレス空間を置き換えます。したがって、信号ハンドラーの関数ポインターが後で有効にならないことがわかっているため、ハンドラーをリセットします。 使用しているプログラムを変更したくない場合は、おそらくここで必要なもの(実際には取得しているもの)です。さらに何かが必要な場合は、自分が信じているように見えるので、編集中のプログラムを変更する必要があります。SIG_DFLexec()exec()

ただし、本当に何か他のものが必要だと思います。シグナルハンドラーに入れたいと思うインストルメンテーションが何であれ、子が終了してで刈り取られた後、親プロセスに入れたいと思いますwaitpid()

于 2012-04-15T06:07:56.873 に答える