我可以使用以下命令在终端中打开一个程序:
stringstream s;
s<<"./~/rajat/app -parameter";
system(s.str().c_str());
我的应用程序继续在终端中运行,我想做的是从同一个程序中关闭这个应用程序,然后使用新参数再次打开它。这该怎么做?
您不能使用system
. 从(BSD)man 3 system
:
调用进程等待shell 完成命令执行,忽略 SIGINT 和 SIGQUIT,并阻塞 SIGCHLD。
因此,您的应用程序将一直阻塞,直到启动的程序完成或终止。
您可以通过在此处和此处fork
使用/ exec
- 手册页来启动程序来获得所需的行为。这就是幕后所做的。您将启动子流程并在您的应用程序中保持控制。system
使用fork
,您将获得已启动进程的进程 ID,并且使用该 ID,您可以使用-此处kill
的手册页- 终止程序并重新启动该程序。
四处寻找fork
/exec
示例,这个网站上可能有很多。
system()
只允许您启动另一个进程并取回其退出代码。您无法控制其他进程的生命周期。
如果要启动其他进程并对其进行控制,则需要使用其他方法。经典的方法是将fork()
你自己的进程分成两个,exec()
另一个进程在子进程中。然后,父母将从fork()
呼叫中获得孩子的 PID,然后可以在您想终止它时从父母向孩子发送合适的信号。
这有点混乱(尤其是当您开始不得不处理 SIGHUP 并清理僵尸进程时),但我不知道有一个标准或 Boost 库会为您做这些讨厌的事情。不过,您可能应该在开始手动编写之前检查一下。
如果您确实选择了fork()
,则有大量在线指南将带您了解几十年来围绕它建立的细节和成语。