我正在使用函数 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);
}