popenで開始されたプロセスを強制終了する 質問する

popenで開始されたプロセスを強制終了する 質問する

を使用してプロセスへのパイプを開いた後popen、開始されたプロセスを強制終了する方法はありますか? ( を使用すると、pcloseプロセスが終了するまで待機しますが、強制終了する必要があるため、 を使用するのは望ましくありません。)

ベストアンサー1

を使用せずpopen()、必要な機能を実行する独自のラッパーを作成してください。

、を使用して&fork()を置き換え、子を呼び出すのは非常に簡単です。stdinstdoutdup2()exec()

そうすれば、親は正確な子 PID を持ち、kill()それを使用できるようになります。

Googleで「popen2() 実装」を検索すると、実行方法のサンプルコードが見つかりますpopen()。10行程度の長さです。dzone.com次のような例を見ることができます。

#define READ 0
#define WRITE 1

pid_t
popen2(const char *command, int *infp, int *outfp)
{
    int p_stdin[2], p_stdout[2];
    pid_t pid;

    if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
        return -1;

    pid = fork();

    if (pid < 0)
        return pid;
    else if (pid == 0)
    {
        close(p_stdin[WRITE]);
        dup2(p_stdin[READ], READ);
        close(p_stdout[READ]);
        dup2(p_stdout[WRITE], WRITE);

        execl("/bin/sh", "sh", "-c", command, NULL);
        perror("execl");
        exit(1);
    }

    if (infp == NULL)
        close(p_stdin[WRITE]);
    else
        *infp = p_stdin[WRITE];

    if (outfp == NULL)
        close(p_stdout[READ]);
    else
        *outfp = p_stdout[READ];

    return pid;
}

注意: popen2() が必要なようですが、私のディストリビューションにはこのメソッドが付属していないようです。

おすすめ記事