を使用してプロセスへのパイプを開いた後popen
、開始されたプロセスを強制終了する方法はありますか? ( を使用すると、pclose
プロセスが終了するまで待機しますが、強制終了する必要があるため、 を使用するのは望ましくありません。)
ベストアンサー1
を使用せずpopen()
、必要な機能を実行する独自のラッパーを作成してください。
、を使用して&fork()
を置き換え、子を呼び出すのは非常に簡単です。stdin
stdout
dup2()
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() が必要なようですが、私のディストリビューションにはこのメソッドが付属していないようです。