関数 popen2 (stackoverflow の他の場所で推奨されている) を使用して、しばらくしてから再度強制終了する必要があるプロセスをプログラムで作成しています。popen2 は PID を返し、この PID を使用してプロセスを強制終了できると考えました。ただし、この方法では機能しません。それを殺すには、返された PID をインクリメントする必要がありますが、これはわかりません (以下のコードを参照)。
さまざまなスレッドがこれを並行して実行している場合、別の問題が発生する可能性があります。その場合、競合状態のために PID が複数異なる可能性があると思います。
私の質問は次のとおりです。マルチスレッド シナリオで popen2 によって作成されたプロセスの PID を確実に特定するにはどうすればよいですか?
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#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;
}
main() {
pid_t pid;
// Create process
pid = popen2("crafty", &in, &out);
sleep(5);
// Why doesn't kill(pid, SIGKILL) work?
kill(pid+1, SIGKILL);
while (1);
}