- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在我不断尝试理解伪终端如何工作的过程中,我编写了一个小程序来尝试运行 bash。
问题是,我的换行符似乎关闭了。 (shell 提示仅在我按下 enter 后出现。)
此外,我仍然无法正常使用 ncurses 程序,例如 vi。谁能告诉我如何为此设置伪终端?
My badly written program can be found here, I encourage you to compile it .操作系统是 GNU/Linux,谢谢。
编辑:像这样编译:gcc program.c -lutil -o program
再次编辑:看起来奇怪间距的问题是由于使用 printf() 造成的,但仍然没有解决 ncurses 程序的问题。
最佳答案
您的程序中存在多个问题。有些相对容易修复 - 其他则不是那么容易:
forkpty()
及其 friend 来自 BSD,不兼容 POSIX。对于新程序,应避免使用它们。来自pty(7) manual page
:
Historically, two pseudoterminal APIs have evolved: BSD and System V. SUSv1 standardized a pseudoterminal API based on the System V API, and this API should be employed in all new programs that use pseudoterminals.
你应该使用 posix_openpt()
反而。这个问题可能并不严重,但您应该意识到这一点。
您正在混合调用原始系统调用(read()
、write()
)和文件流(printf()
、fgets()
)函数。这是迷惑自己的好方法。一般来说,您应该选择一种方法并坚持使用。在这种情况下,最好使用低级系统调用(read()
、write()
)来避免因 C 库函数使用的 I/O 缓冲区的存在而引起的任何问题。
您假设您的终端使用基于行的范例,使用 printf()
和 fgets()
.这并不总是正确的,尤其是在处理像 vim
这样的交互式程序时。
您假设使用 C 风格的单字节 null 终止字符串范例。终端通常处理字符和字节——而不是字符串。虽然大多数字符集编码都避免使用零字节,但并不是所有的都这样做。
由于上述 (2)、(3) 和 (4),您没有使用 read()
和 write()
正确。您应该使用它们的返回值来确定它们处理了多少字节,而不是像 strlen()
这样的基于字符串的函数。 .
在我看来,这是最难解决的问题:您隐含地假设:
终端(或其驱动程序)是无状态的:它不是。时期。我怀疑至少有两个状态控件是基于 ncurses 的程序无法正常工作的原因:line mode和 local echo control终端。至少这些必须在父/主终端和从终端之间匹配,以避免各种奇怪的人工制品。
终端的控制接口(interface)可以通过来回传递字节来传递:但并非总是如此。现代虚拟终端允许通过 ioctl()
进行一定程度的带外控制。调用,如 Linux 所述 here .
处理这个问题最简单的方法可能是将父终端设置为原始模式,让从伪终端驱动程序处理尴尬的细节。
您可能想看看 this program这似乎工作正常。它来自这本书 The Linux Programming Interface完整的源代码是 here . 免责声明:我没有读过这本书,也不是在推销它 - 我只是使用 Google 找到了这个程序。
关于c - 伪终端中的 Ncurses 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409333/
我正在用 C 和 C++ 编写 ncurses 程序。我还没有找到向用户隐藏光标的方法。我在互联网上查了一下,但我发现的大多数信息要么涉及 (n)curses 的 Python/Ruby 实现,要么实
我有我的 window WINDOW *win = newwin(40, 40, 3, 3); 当输入一些文本并跨越更多行时,保留窗口内边框周围整齐空白的最佳方法是什么?我似乎找不到在 NCurses
我使用 ncurses 创建了一个单窗口菜单方案并让它运行起来。当我添加第二个窗口时,我无法再触发我的 wgetch 调用(或者看起来是这样)。 函数原型(prototype)让我有些困惑: int
我一直在测试 ncurses,我尝试使用 Windows 编写一个简单的代码,通过阅读教程中的代码,在我看来,如果仅对一个窗口进行更改,调用 wrefresh() 就足够了。所以我尝试了以下代码,但它
我是一名初学者 C 程序员,我的一项任务要求我为 Logo 编程语言编写一个解释器。为此,我想知道是否有可能在使用 ncurses 库时将屏幕拆分,以便一半保留具有常规文本输入/输出的基本终端属性,另
在 ncurses 中捕获 control+key 的正确方法是什么? 当前我正在这样做定义控制,如下所示: #define ctl(x) ((x) & 0x1f) 它工作正常,但问题是我不能同时捕捉
有没有办法在mvwprintw中使用ANSI转义码? mvwprintw(window, 0, 0,"%c[%dmCOLORED_TEXT!\n", 0x1B, 32);//doesn't work
我以前问过这样的问题,但它有点误导,因为我没有包括打印顺序。自从我了解了整个概念的变化后,我认为再问一次会更合适。 #include using namespace std; in
我对 ncurses 比较陌生,只是想知道在我开始的 ncurses TUI 中显示在终端/命令行中执行的命令输出的简单方法是什么。即像这样的伪代码(我知道它不起作用,只是为了得到重点:)目标是呈现一
我正在使用 ncurses 在 C 中创建一个基于控制台的应用程序,它接受单个键输入但也读取组合键。例如,当用户同时按下 S 键和 F 键时,我希望它运行一些功能。是否有一些像 getch() 这样的
我试图通过将值 COLOR_BLUE 设置为 rgb 值(1000, 0, 0)来将文本 block 的背景设置为红色。如果我使用 Gnome 的“终端”应用程序,背景是正确的(红色),但如果我使用
main :: IO() main = runCurses $ do setEcho False w ev == EventCharacter 'q' || ev == EventChara
我需要使用 ncurses 实现一个简单的文本阅读器,有点像 unix 的 less。 我在理解如何操作时遇到问题。我目前有一个窗口,每次我按下向下键(例如)时,我都会在适当的起点刷新所有行,给人一种
为什么这段代码在这里: #include #define WIN 5 #define WI win[0] #define WC win[1] int ymax, xmax; WINDOW *win[
我正在使用 ncurses 构建我自己的终端。我的主窗口包含 5 个其他窗口。我位于下面的窗口是提示面板。我希望在那里输入文本,并且我也希望能够在那里输入文本。我已使用 wmove 定位光标,但光标仍
我正在尝试使用 ncurses 库在屏幕的特定点上色。 我写了这段代码: #include int main(void) { initscr(); start_color();
我正在使用 ncurses 为我的应用程序制作一个简单的 TUI。我掌握了创建和打印到窗口的基础知识,但我在输入方面遇到问题。 当我写完的时候,光标定位在我写的字符串的末尾 但是当我开始打字时,光标会
我有一个基本的 Linux 发行版,运行在一台连接激光的机器上。我想开发一个界面,它允许我: 配置激光设置(例如工具栏和按钮) 显示激光的当前路径(例如图形窗口) 因为这些是最基本的机器,所以我没有安
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我正在编写一个需要 ncurses 提供的高级终端控制的程序,但我无
我一直在尝试自学 ncurses,到目前为止我很喜欢它。但是,我正在尝试编写一个像 pico 或 nano 这样的小型文本编辑器。到目前为止,我已经设置得相当好。我创建了一个函数来映射键。无论我做什么
我是一名优秀的程序员,十分优秀!