【问题标题】:Launching a second Linux program and exit current one from C/C++?启动第二个 Linux 程序并从 C/C++ 退出当前程序?
【发布时间】:2021-03-14 13:30:57
【问题描述】:

是否可以从 C 或 C++ Linux 程序(例如 /usr/bin/foo)以编程方式启动另一个程序(例如 /usr/bin/bar),并让 foo 正常退出并让 bar 继续运行?

system(3) 不适合,因为它会阻塞直到其他程序完成。我想要立即返回的东西。

这些程序都是 GUI 程序,但我怀疑这不相关。

Qt 或 boost::process 中有什么可以提供帮助的吗?

有没有我可以通过system(3) 运行的通用 Linux 包装程序来实现这一点?我试过xdg-open,但我不认为这是正确的。

基本上,我希望第二个程序与第一个程序“分离”,并且表现得就像用户通过系统 UI 启动它一样。 (例如在 MacOS 上,有一个open 命令,所以它就像system("open /usr/bin/bar"))

【问题讨论】:

  • fork() 和 execv() 的组合通常是这样完成的。或者,你可以system() 和& 最后在后台运行,但这很讨厌。
  • 既然你提到了boost::process,你可能想看看boost::process::spawn 或boost::process::child 类,它允许你在detaching 它之前设置和创建一个子进程。跨度>
  • 既然你提到了Qt,那么QProcess::start就是这样做的。
  • @rustyx:当以QProcess::start 开始的进程继续运行时,我们确定父进程可以退出吗?
  • @rustyx:也许QProcess::startDetached 看起来是对的。

标签: c++ c linux qt boost-process


【解决方案1】:

使用Qt,您可以使用bool QProcess::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = nullptr),如此处所述https://doc.qt.io/qt-5/qprocess.html#startDetached

这是一个如何使用它的最小示例:

#include <QCoreApplication>
#include <QProcess>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /*
     * starting netstat with args
     * in case the main event loop is exited
     * netstat will be parented to init ( pid 1 ) and continue running
     */
    QProcess::startDetached("/bin/netstat", QStringList() << "-pla" << "-ntuc");

    return a.exec();
}

【讨论】:

    【解决方案2】:

    经典的方法是使用 Fork-Exec:https://en.wikipedia.org/wiki/Fork%E2%80%93exec,它可用于任何 Unix 派生的操作系统,包括 Linux。无需添加任何库、框架等。

    【讨论】:

    • 我最终使用了QProcess::startDetached,但我敢肯定它只是按照您的建议执行 fork-exec。
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多