1

Kill(pid、0)はエラーコードを正しく設定していないようです...人がkillについて述べているように

エラー

次の場合、kill()関数は失敗します。

EINVAL sig引数の値は、無効またはサポートされていないシグナル番号です。
EPERMプロセスには、受信プロセスに信号を送信する権限がありません。
ESRCHpidで指定されたものに対応するプロセスまたはプロセスグループが見つかりません。次のセクションは参考情報です。 1

ENOENT(そのようなファイルやディレクトリはありません)を返し、EINTR(システムコールが中断されました)を返すことがあります...

これが私がしていることです:

kill(g_StatusInstance[i].pid, SIGTERM) == -1 && log_fatal_syscall("kill-sigterm");
kill(g_StatusInstance[i].pid, 0);

log_info_console( "Checking process for errors: %s\n", strerror(errno));

if(errno != ENOENT)
{
   kill(g_StatusInstance[i].pid, SIGKILL) == -1 && log_fatal_syscall("kill-sigkill");
}

私は何か間違ったことをしていますか?

4

2 に答える 2

4

Kill(pid, 0)エラーコードが正しく設定されていないようです...ENOENTを返しています...EINTR

これが私がしていることです:

...
kill(g_StatusInstance[i].pid, 0);
log_info_console( "Checking process for errors: %s\n", strerror(errno));

私は何か間違ったことをしていますか?

はい。kill()システムコールの戻り値をチェックしていません。kill()成功した場合、errnoを特定の値に設定しません。

これを試して:

if(kill(g_StatusInstance[i].pid, 0) == -1) {
  log_info_console( "Checking process for errors: %s\n", strerror(errno));
} else {
  log_info_console( "kill returned 0, process still alive\n" );
}

より一般的には、を返すように宣言されていない限り、すべてのシステムコールまたはライブラリコールの戻り値を確認する必要がありますvoid

于 2012-10-25T19:10:42.513 に答える
0

議論に基づくと、あなたの質問はおそらく「なぜ私は私kill()が期待した効果を生み出さなかったのですか?」です。

それが起こっている理由を理解するために、最初straceにのターゲットであるプロセスを試してみる必要がありkill()ます。によって既存のプロセスにアタッチするpidか、の下で呼び出しstraceます。 strace信号マスクへの変更を表示し、信号がいつ到着するかを示します。シグナルが到着している場合は、が対象とするプロセスをデバッグしkill()、インストール済み/デフォルトのシグナルハンドラーが何を期待されているかを理解する必要があります。

于 2012-10-26T04:11:44.760 に答える