Ncurses CTRL + s hangs getch()

Ncurses CTRL + s hangs getch()

本文关键字:getch hangs CTRL Ncurses      更新时间:2023-10-16

为什么在这个简单的程序中:

#include <curses.h>
#include <iostream>
int main() {
initscr();
keypad(stdscr, TRUE);
timeout(-1);
int c = getch();
std::cout << c << std::endl;
endwin();
}

ctrl+s挂起它?

当你使用initscr开始诅咒时,终端处于烹饪模式,这遵循 XON/XOFF。 在诅咒手册页中,那被称为"流控字符">;POSIX将其称为"输出控制">

IXON
Enable start/stop output control.

如果调用raw,则会关闭XON/XOFF,您可以使用控制S

#include <curses.h>
#include <iostream>
int main() {
initscr();
raw(); // possibly what you intended
keypad(stdscr, TRUE);
timeout(-1);
int c = getch();
std::cout << c << std::endl;
endwin();
}

您的应用程序可以调用tcgetattr来确定是否设置了底层 XON/XOFF 模式,但这无助于确定 curses 是否设置了原始模式:

  • 诅咒总是将终端设置为原始模式,
  • curses 模拟应用程序的熟/生模式,以及
  • curses 没有应用程序可以调用的函数来查找当前状态。

我相信你正在经历XOFF/XON流控制。CtrlS是 XOFF,并停止输出,直到发送CtrlQ(XON(。您可以通过键入CtrlQ来恢复程序。

这不是代码的问题。它发生在终端层面。