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)
根据这个问题:
如何在 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)