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