5

子プロセスからトゥインクル コマンド ラインを実行しようとしています。たとえば、次のようにします。

int hangup() {
write_on_display("line3", "            ");
write_on_display("hide_icon", "DIALTONE");
write_on_display("hide_icon", "BACKLIGHT");

int pid = fork();
if (pid == 0) {
    int res = execl("/usr/bin/twinkle", " ", "--immediate", "--cmd",
            "answerbye", (char *) NULL);
    _exit(0);
} else {
    perror("hangup");
    return 0;
}
return 1;
}

しかし、きらめきはゾンビになります:

10020 pts/1    Z+     0:00 [twinkle] <defunct>
10040 pts/1    Z+     0:00 [twinkle] <defunct>
10053 pts/1    Z+     0:00 [twinkle] <defunct>
10064 pts/1    Z+     0:00 [twinkle] <defunct>
10097 pts/1    Z+     0:00 [twinkle] <defunct>
10108 pts/1    Z+     0:00 [twinkle] <defunct>
10130 pts/1    Z+     0:00 [twinkle] <defunct>

signal(SIGCHLD, SIG_IGN); を設定しようとしました。しかし、成功しませんでした。実際には、twinkle が終了する前に、子プロセスが終了したと思います。

次のようにコマンドラインからトゥインクルを実行します。

twinkle --immediate --call 100

ゾンビにはなりません - トゥインクルは適切に閉じます。私がそこに欠けているものは何ですか?

4

2 に答える 2

7

親プロセスwaitpid()は、子のプロセスIDを使用して呼び出す必要があります。リンクされたリファレンスページから:

これらのシステムコールはすべて、呼び出しプロセスの子の状態変化を待機し、状態が変化した子に関する情報を取得するために使用されます。状態変化は次のように見なされます。子が終了しました。子供は合図によって止められました。または子供は合図によって再開されました。終了した子の場合、待機を実行すると、システムは子に関連付けられたリソースを解放できます。待機が実行されない場合、終了した子は「ゾンビ」状態のままになります(以下の注を参照)。

例えば:

pid_t pid = fork();
if (0 == pid)
{
    /* Child process. */
}
else
{
    /* Parent process, wait for child to complete. */
    int status;
    waitpid(pid, &status, 0);
}
于 2012-12-06T15:08:46.623 に答える
4

はい。ただし、親と子が非同期で動作する必要があります。

実際、私は自分の間違いを見つけました。したがって、誰かが同様の問題を抱えている場合、次のようなシグナルハンドラー関数を使用します。

void catch_child(int sig_num)
{
    /* when we get here, we know there's a zombie child waiting */
    int child_status;

    wait(&child_status);

}

およびシグナル(SIGCHLD、catch_child)

main() 関数ではすべてが機能します。

PP Here: は非常に良い説明です。

于 2012-12-07T10:30:42.593 に答える