-2

我可以使用以下命令在终端中打开一个程序:

stringstream s;
s<<"./~/rajat/app -parameter";
system(s.str().c_str());

我的应用程序继续在终端中运行,我想做的是从同一个程序中关闭这个应用程序,然后使用新参数再次打开它。这该怎么做?

4

2 回答 2

3

您不能使用system. 从(BSD)man 3 system

调用进程等待shell 完成命令执行,忽略 SIGINT 和 SIGQUIT,并阻塞 SIGCHLD。

因此,您的应用程序将一直阻塞,直到启动的程序完成或终止。

您可以通过在此处此处fork使用/ exec- 手册页来启动程序来获得所需的行为。这就是幕后所做的。您将启动子流程并在您的应用程序中保持控制。system

使用fork,您将获得已启动进程的进程 ID,并且使用该 ID,您可以使用-此处kill的手册页- 终止程序并重新启动该程序。

四处寻找fork/exec示例,这个网站上可能有很多。

于 2012-09-05T16:26:28.790 回答
2

system()只允许您启动另一个进程并取回其退出代码。您无法控制其他进程的生命周期。

如果要启动其他进程并对其进行控制,则需要使用其他方法。经典的方法是将fork()你自己的进程分成两个,exec()另一个进程在子进程中。然后,父母将从fork()呼叫中获得孩子的 PID,然后可以在您想终止它时从父母向孩子发送合适的信号。

这有点混乱(尤其是当您开始不得不处理 SIGHUP 并清理僵尸进程时),但我不知道有一个标准或 Boost 库会为您做这些讨厌的事情。不过,您可能应该在开始手动编写之前检查一下。

如果您确实选择了fork(),则有大量在线指南将带您了解几十年来围绕它建立的细节和成语。

于 2012-09-05T16:30:38.960 回答