C++ 使用c++;程序
我可以使用以下命令在终端中打开程序:C++ 使用c++;程序,c++,c,linux,terminal,C++,C,Linux,Terminal,我可以使用以下命令在终端中打开程序: stringstream s; s<<"./~/rajat/app -parameter"; system(s.str().c_str()); strings; s使用系统无法执行此操作。来自(BSD)man 3系统: 调用进程等待shell完成执行命令,忽略SIGINT和SIGQUIT,并阻塞SIGCHLD 因此,您的应用程序将被阻止,直到启动的程序完成或终止 您可以通过使用fork/exec-手册页和启动程序来获得所需的行为。这就是系统在发
stringstream s;
s<<"./~/rajat/app -parameter";
system(s.str().c_str());
strings;
s使用系统
无法执行此操作。来自(BSD)man 3系统
:
调用进程等待shell完成执行命令,忽略SIGINT和SIGQUIT,并阻塞SIGCHLD
因此,您的应用程序将被阻止,直到启动的程序完成或终止
您可以通过使用fork
/exec
-手册页和启动程序来获得所需的行为。这就是系统
在发动机罩下所做的工作。您将启动子流程并在应用程序中保持控制
使用fork
,您将获得已启动进程的进程id,使用该id,您可以使用kill
-手册页终止程序,然后重新启动程序
查找fork
/exec
示例,此站点上可能不止这些示例。system()
仅允许您启动另一个进程并获取其退出代码。您无法控制其他流程的生命周期
如果要启动其他流程并控制它们,则需要使用其他方法。经典的方法是fork()
将您自己的进程一分为二,并exec()
子进程中的另一个进程。然后,父对象将从fork()
调用中获得子对象的PID,然后当您想要终止它时,可以从父对象向子对象发送合适的信号
这有点混乱(特别是当您开始处理SIGHUP和清理僵尸进程时),但我不知道有哪个标准或Boost库可以为您处理这些讨厌的部分。不过,在开始手动编写之前,您可能应该检查一下
如果你使用fork()
,网上有很多指南,可以让你了解几十年来围绕它形成的细节和习惯用法。你需要提供一些方法,从外部通过管道(或其他IPC机制)或让它响应信号来控制app
(例如SIGHUP)并且您的控制应用程序可以使用这些方法终止它,然后根据需要重新执行它。您能告诉我反对投票的原因吗?您得到了一半请求的行为,但另一半很容易实现。fork()
返回一个进程ID,然后使用kill(pid,信号)
在需要时终止生成的进程。