【问题标题】:control linux terminal using c++ program使用c++程序控制linux终端
【发布时间】:2012-08-30 10:16:39
【问题描述】:

我可以使用以下方法在终端中打开程序:

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

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

【问题讨论】:

  • 您需要提供一些方法来从外部控制app,或者通过管道(或其他一些 IPC 机制)或使其响应信号(例如 SIGHUP)和您的控制应用程序可以使用这些方法终止它,然后根据需要重新执行它。
  • 你能告诉我投反对票的原因吗?

标签: c++ c linux terminal


【解决方案1】:

您无法使用system 执行此操作。来自(BSD)man 3 system

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

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

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

使用fork,您将获得启动进程的进程ID,并使用它,例如使用 kill 终止程序 - 手册页 here - 并重新启动程序。

四处寻找fork/exec的例子,这个网站上可能不止几个。

【讨论】:

  • 你得到了一半的请求行为,但另一半很容易实现。 fork() 返回一个进程 ID,然后在需要时使用 kill(pid, signal) 终止生成的进程。
【解决方案2】:

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

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

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

如果你选择fork(),网上有很多指南可以带你了解几十年来围绕它建立起来的细节和成语。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2013-05-09
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多