Linux 上没有控制台应用程序
Posted
技术标签:
【中文标题】Linux 上没有控制台应用程序【英文标题】:No console application on Linux 【发布时间】:2020-07-12 21:26:21 【问题描述】:在 Windows 上,我通常会创建一个 Windows 桌面应用程序,这是因为控制台应用程序会在屏幕上显示一个简短的黑框。
我在 Linux Mint 上使用 CodeBlocks,但在 Linux 上,我怎么能做与上述相同的操作?
我不想在显示终端窗口后隐藏它。
【问题讨论】:
在 Linux 上没有这样的“控制台应用程序”,因为应用程序不会(在大多数情况下)为自己打开控制台窗口。不存在导致任何此类事情发生的通用应用程序属性。 有很多应用程序希望将其标准流用于其主要 UI,但这与在任何屏幕上显示任何类型的窗口无关。事实上恰恰相反。 我想你只是想从终端运行你的程序。 @JohnBollinger 我认为他看到的是在 Linux 的窗口系统中双击“vanilla”C++ 可执行文件......通常会打开一个控制台窗口......这非常相似双击 Windows 中的“控制台”应用程序。 QT 有某种魔法可以防止控制台窗口打开 IIRC。 在 Linux 上,您可以通过 GUI 启动,在这种情况下不应该有任何类型的控制台窗口,或者您从控制台本身启动,在这种情况下可以有一些直接的控制台输出在用户选择的shell和终端程序中。 @tadman 因此,如果我执行 ./myProgram 或双击该文件,如何确保屏幕上没有任何内容,无论是终端还是 GUI? 【参考方案1】:Linux 没有与 windows 相同的“subsystem”概念:控制台和桌面应用程序之间没有区别或分离。当你在 Linux 上启动一个应用程序时,它不会打开控制台窗口,除非程序员明确地编程让它打开一个。
如果应用程序向stdout
或stderr
写入任何内容,会发生什么取决于应用程序究竟是如何启动的。默认情况下,应用程序继承其父进程的stdout
和stderr
。如果应用程序是从终端启动的,则输出将在终端上可见。如果应用程序是由桌面环境从菜单项启动的,则输出可能会进入日志文件,否则可能会丢失。
如果您在从 IDE 运行程序时看到一个终端窗口打开,那是 IDE 正在为您做的事情,而不是您的应用程序。如果它困扰您,我认为 IDE 有办法在设置中禁用此行为。
【讨论】:
不仅仅是 IDE.... 这也发生在 Gnome、KDE 等中。 站点注释:如果 Linux 应用程序确实以某种方式打开了一个终端窗口,那将会非常奇怪和烦人。 @JoelFan 你是什么意思?如果单击 Gnome/KDE 系统菜单项会在终端仿真器中打开应用程序,这是因为该菜单项被配置为打开终端仿真器。这由 .desktop 文件中的Terminal
设置控制specifications.freedesktop.org/desktop-entry-spec/…
@Joni,我说的是直接双击可执行文件【参考方案2】:
研究 QT。它是一个适用于 Linux 的 GUI 框架。
您可以在不创建主窗口的情况下编写代码(或者您可能必须有一个主窗口,但它总是可以隐藏......我已经有一段时间没有使用它了)。
但请注意,您可能会遇到此类设计的可用性问题...用户无法知道您的应用是否已启动或是否成功、何时完成等。
【讨论】:
【参考方案3】:简单的方法是使用(例如)xterm
[或gnome-terminal
] 来获取终端窗口。
然后,从 shell [手动] 调用您的程序:
/path_to_my_program
您可以配置代码块来为您执行此操作。
或者,您可以添加一些保持默认窗口打开的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
pid_t pid = fork();
if (pid != 0)
waitpid(pid,NULL,0);
while (1) sleep(1);
long double n;
n=5;
printf("n= %Lf\n",n);
return 0;
更新:
可以从以下位置控制调用命令:Settings -> Environment -> General Settings
默认是在xterm
子窗口[弹出] 中调用。您可以更改设置以(重新)使用现有的 [终端] 窗口。
请注意 [a codeblocks program] cb_console_runner
被使用。你可以用你喜欢的东西来代替它。
我不想要 GUI 也不想要终端弹出...
你需要一些类的终端来运行命令。这个可能是一个脚本,可以适当地转移stdin/stdout/stderr
[并禁止调用sub-window],所以你必须尝试一下。
正如我上面提到的,您可以在代码块之外打开一个终端窗口,然后在其中手动运行命令。从技术上讲,这不是一个弹出窗口。但是,您会丢失 [自动] 调试器调用。
【讨论】:
以上是关于Linux 上没有控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章
代号 One 控制中心无法在 Linux 操作系统 (Ubuntu) 上运行
Linux 上的单实例 dotnetcore cli 应用程序
防止 .Net Core 5 控制台应用程序在 Linux 作为服务上运行时结束的推荐方法