首先,这类似于在此之前和其他地方所提出的问题,但是我无法获得所有这些答案。我要构建的是围绕另一个程序的“包装器”,启动该程序并返回正在运行的进程的PID。
稍后,要重新配置某些内容,我必须“杀死-9 pid”说的程序(相信我,没有其他方法,即使“ kill pid”也行不通),进行重新配置,重新启动其他程序,然后返回PID返回上游。
我从其他任何答案中都尝试过的东西几乎都没有返回pid,而不是返回system(),popen(),fork(),而exec_()系列中没有任何东西。它们都只返回0或负错误,没有返回pid。 getpid()和getppid()没有帮助,它们只是调用程序的pid,而不是我正在启动的其他程序的pid。
它也可能与其他程序包含“ os_daemon()”这一行有关,也就是说,当它启动时,它会填充并自我守护。注意,我可以阅读该其他程序的源代码,但无法对其进行修改。
无论如何,我想做的是这样的:
int startup() {
int retval;
/* do other stuff */
retval = startsomehow("otherprogram args");
return retval;
}
int reconfigure(int runningpid) {
int retval;
system("kill -9 %d",runningpid); /* this doesn't work as written, but you get the idea of what i'm trying to do */
/* do other stuff */
retval = startsomething("otherprogram args");
return retval;
}
我最接近的方法是:
system("otherprogram args");
retval = (int)system("ps aux | awk '/otherprogram/ {print $1}' | head -n 1"); //this doesn't correctly parse it into an int and still returns 0 because I'm not reading the output properly, but you get the idea
这很笨拙,但是几乎可以正常工作,awk可以打印到命令行,但是不能将其作为正确格式的int放入代码中,如果我可以做得到,我会接受它作为最后的努力,但是我宁愿拥有一些可以直接返回pid而又不会过多使用system()的东西。
绝对绝对的最后手段就是忽略事物的pid一边,然后发出“ killall -9 otherprogram”,但是我有机会在将来最终以相同的pid运行同一程序的2个副本,所以我更希望能够杀死一个而别一个人。
ps,这是在我使用fork()时在测试文件中发生的情况:
int main(int argc, char *argv[])
{
fprintf(stdout,"Start, I am pid = %d\n",getpid());
int foo = (int)fork();
fprintf(stdout,"Forked, pid = %d\n",foo);
if (foo == 0) {
fprintf(stdout,"This is child, my pid = %d\n",getpid());
fprintf(stdout,"This is child, foo = %d\n",foo);
} else {
fprintf(stdout,"This is parent, my pid = %d\n",getpid());
fprintf(stdout,"This is parent, foo = %d\n",foo);
foo = exec("otherprogram","args"); //nb, redacted name
fprintf(stdout,"exec returned = %d\n",foo);
system("ps aux | tail -n 9");
}
}
给予:
Start, I am pid = 367
Forked, pid = 368
This is parent, my pid = 367
This is parent, foo = 368
Forked, pid = 0
This is child, my pid = 368
This is child, foo = 0
329 root [kworker/0:0]
354 root [kworker/u2:0]
366 root [kworker/u2:2]
367 root ./testfoo
368 root [testfoo]
370 nobody otherprogram
371 root sh -c ps aux | tail -n 9
372 root ps aux
373 root tail -n 9
这些结果都没有给出'370',这是我想要的数字