Boost::process 在 linux 上隐藏控制台

Boost::process hide console on linux

根据这个问题:

如何在 Linux 平台上使用 boost::process 实现相同的目标? (防止在新生成的子进程上创建控制台 window)

我的用例如下:

我正在尝试调用从 .NET 5.0 AvaloniaUI (C#) 构建的跨平台 GUI 应用程序。我是从另一个从 gtkmm (c++) 构建的 GUI 应用程序调用它的。 它确实创建了黑色控制台和 GUI window。

当我尝试用另一个跨平台的 Avalonia 应用程序调用同样提到的 Avalonia 应用程序时,不会出现此症状。它不会创建任何控制台,只会按预期创建 GUI window。 (使用 .NET C# 中的 System.Diagnostics.Process)。

所以也许背后有一些细节使这些 api 表现不同? (boost::process / System.Diagnostics.Process)

基本上我正在寻找 api 在 c++

上用 System.Diagnostics.Process (C#) 做同样的事情

在 linux 上,无论如何都不会创建新的控制台。因此,您可能唯一想做的就是阻止子进程共享父进程,如下所示:

#include <boost/process.hpp>

namespace bp = boost::process;
int main() {
    bp::child child(bp::search_path("xclock"), //
                    bp::std_in.null(),         //
                    bp::std_out.null(),        //
                    bp::std_err.null());

    child.wait();
}

另一方面,如果您喜欢创建一个终端,您必须告诉OS您想要哪个以及如何启动它:

bp::child child(bp::search_path("gnome-terminal"),  //
                std::vector<std::string>{"-x", "/usr/bin/htop"}, //
                bp::std_in.null(),                  //
                bp::std_out.null(),                 //
                bp::std_err.null());

或者,例如

bp::child child(bp::search_path("gnome-terminal"),  //
                std::vector<std::string>{"-x", "/usr/bin/htop"}, //
                bp::std_in.null(),                  //
                bp::std_out.null(),                 //
                bp::std_err.null());

请注意 gnome-terminal 启动器分叉(因此它立即“returns”,将终端 运行 留在 htop 内部),但是 xterm才不是。因此,在 UNIX 上,与以往一样,您有很多选择。

Linux 不会像其他人建议的那样创建新控制台。(除非明确定义)

查了之后才发现,这只是误会

如果您使用一些 GUI 库(如 GTKmm,在这种情况下),并尝试生成新进程,这也是一个 GUI window,可能会有一个 afterimage-like 如果你不异步执行它,效果

(如果第二个 GUI window 是用 black 背景初始化的,就像用 AvaloniaUI 创建的那样,你可能会把它当作另一个控制台 :p)