如何从系统函数调用中删除后台进程
如何终止使用C语言的系统函数调用执行的后台进程。 例如,我有一个编译的应用程序调用“fooprocess”。 然后我想编写一个程序,使用系统函数在后台执行fooprocess应用程序,请在下面的代码中查看,
const char app[] = "fooprocess &"; system(app);
如您所见,有一个“&”字符,以便我可以在后台运行fooprocess应用程序。 我该怎样杀死这个过程?
非常感谢。
要与流程进行交互,您需要其PID。 我不确定系统是否可行,但另一种方法是使用fork + exec自行分叉。
你绝对不能使用system("foo &");
创建后来可以监视/终止的后台进程。 任何这样的使用都有一个巨大的固有错误:即使你知道pid,也无法判断带有该pid的进程是你最初运行的进程,还是一个完全不同的进程,后来恰好获得了相同的pid。
要解决这个问题(以及无数其他你不想考虑的问题,否则它会让你头疼)你应该忘记你曾经学过system
函数并用fork
和exec
或posix_spawn
创建你的子进程。 这将导致直接的子进程(您当前的方法创建的孙子进入孤立并被init
进程接收),您可以wait
/ wait
执行,直到您执行wait
操作,子进程的pid 属于您并且无法重复使用,因此向其发送信号等是安全的。
我用这个尝试了你的问题:
ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill
你可以把它放在system()中,如下所示:
system("ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill");
那可行。