如何终止使用 C 语言中的系统函数调用执行的后台进程。例如,我有一个编译的应用程序调用“fooprocess”。然后我想写一个程序,使用系统函数在后台执行 fooprocess 应用程序,请看下面的代码,
const char app[] = "fooprocess &";
system(app);
如您所见,有一个“&”字符,以便我可以在后台运行 fooprocess 应用程序。我怎样才能杀死这个 fooprocess?
非常感谢。
如何终止使用 C 语言中的系统函数调用执行的后台进程。例如,我有一个编译的应用程序调用“fooprocess”。然后我想写一个程序,使用系统函数在后台执行 fooprocess 应用程序,请看下面的代码,
const char app[] = "fooprocess &";
system(app);
如您所见,有一个“&”字符,以便我可以在后台运行 fooprocess 应用程序。我怎样才能杀死这个 fooprocess?
非常感谢。
要与进程交互,您需要它的 PID。我不确定是否有可能,system
但一种替代方法是使用 fork + exec 自己分叉进程。
您绝对不能system("foo &");
用来创建以后可以监视/杀死的后台进程。任何这样的使用都有一个巨大的固有错误:即使您知道 pid,也无法判断具有该 pid 的进程是您最初运行的进程,还是后来碰巧获得相同 pid 的完全不同的进程。
要解决这个问题(以及无数其他您不想考虑的问题,否则会令您头疼),您应该忘记您曾经了解过该system
功能并使用fork
and exec
, or创建您的子进程posix_spawn
。这将导致一个直接的子进程(您当前的方法是创建孙子进程,这些子进程将被孤立并被init
进程接收),您可以wait
/waitpid
打开它,并且在您执行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");
那可行。