启动第二个 Linux 程序并从 C/C++ 退出当前程序?
Launching a second Linux program and exit current one from C/C++?
是否可以从 C 或 C++ Linux 程序(比如 /usr/bin/foo
)以编程方式启动另一个程序(比如 /usr/bin/bar
),然后让 foo
退出通常 bar
保持 运行ning?
system(3)
不合适,因为它会阻塞直到另一个程序完成。我想要立即 returns 的东西。
这两个程序都是 GUI 个程序,但我怀疑这不相关。
Qt 或 boost::process 中有什么可以帮助的吗?
是否有任何通用的 Linux 包装程序我可以 运行 到 system(3)
来实现这个?我试过 xdg-open
,但我认为这不对。
基本上我希望第二个程序与第一个程序“分离”,就像用户通过系统启动它一样 UI。 (例如,在 MacOS 上,有一个 open
命令,所以它就像 system("open /usr/bin/bar")
)
使用 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();
}
经典方法是使用 Fork-Exec:https://en.wikipedia.org/wiki/Fork%E2%80%93exec 它在任何派生的 Unix OS 中都可用,包括 Linux。无需添加任何库、框架等
是否可以从 C 或 C++ Linux 程序(比如 /usr/bin/foo
)以编程方式启动另一个程序(比如 /usr/bin/bar
),然后让 foo
退出通常 bar
保持 运行ning?
system(3)
不合适,因为它会阻塞直到另一个程序完成。我想要立即 returns 的东西。
这两个程序都是 GUI 个程序,但我怀疑这不相关。
Qt 或 boost::process 中有什么可以帮助的吗?
是否有任何通用的 Linux 包装程序我可以 运行 到 system(3)
来实现这个?我试过 xdg-open
,但我认为这不对。
基本上我希望第二个程序与第一个程序“分离”,就像用户通过系统启动它一样 UI。 (例如,在 MacOS 上,有一个 open
命令,所以它就像 system("open /usr/bin/bar")
)
使用 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();
}
经典方法是使用 Fork-Exec:https://en.wikipedia.org/wiki/Fork%E2%80%93exec 它在任何派生的 Unix OS 中都可用,包括 Linux。无需添加任何库、框架等