0

これは私のコードです。単純化しました。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

void signal_handle(int sig)
{
    int status;
    wait(&status);
}

int main()
{
    pid_t pid = fork();

    if (pid > 0)
        signal(SIGCHLD, signal_handle);
    if (pid == 0) {
        if (execl("/bin/ls", "/", (char *)0) < 0)
        {
            perror("execl");
            return -1;
        }
    }
    return 0;
}

実行すると、息子プロセスは実行結果を出力しますが、父親プロセスはブロックされていることがわかりました。

父親に息子の手続きが多い場合はどうすればいいですか?wait(&status)ごとに設定されていますか?

下手な英語で本当にごめんなさい!

4

1 に答える 1

1

親プロセスがハングする理由がわかりません。また、私のマシンでは動作しません。

の後にfork()、親プロセスが呼び出しsignal()てシグナルハンドラーを設定し、すぐに終了します。一方、子は実行lsして現在のディレクトリの内容を出力します("/"引数がargv[0]、プログラム名になり、追加の引数がないため)。その後、それも終了します。非常にまれな状況を除いて、親は子が完了するずっと前に終了しました。

親プロセスが「子の死」信号を受け取るまで待機する場合はpause()、親のみの実行パスにへの呼び出しを追加します。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

static void signal_handle(int sig)
{
    int status;
    pid_t pid = wait(&status);
    printf("%d: signal %d child %d status 0x%.4X\n", (int)getpid(), sig, (int)pid, status);
}

int main(void)
{
    pid_t pid = fork();

    if (pid > 0)
    {
        signal(SIGCHLD, signal_handle);
        pause();
    }
    else if (pid == 0)
    {
        execl("/bin/ls", "ls", "/", (char *)0);
        perror("execl");
        return -1;
    }
    else
        perror("fork");
    return 0;
}
于 2012-05-31T06:17:47.273 に答える