终端在运行ncurses程序后搞砸了

时间:2015-09-02 19:08:50

标签: c++ linux terminal ncurses

这是我的程序(好吧,main为NCursesViewController实例调用此方法):

void NCursesViewController::Run(){
    initscr(); //Init ncurses standard screen
    raw();
    printw("WELCOME");
    endwin(); //Free Ncurses resources
    getch();
}

在Ubuntu终端上运行后,终端仍然处于某种奇怪的状态;无论我输入什么,光标都不会移动。如果按Enter键,它会运行我键入的任何内容。所以我看不到我打字的内容......有什么解决方法吗?每次都要打开一个终端是很麻烦的。我在类似的问题中看到他们保存并恢复了终端设置,但他们使用了ssh和tty。

2 个答案:

答案 0 :(得分:3)

endwin(); //Free Ncurses resources
getch();

尝试在endwin()之后删除任何/所有“curses调用”。

在这种情况下,注释掉getch();并试试。
您可以查看代码以查找在endwin()之后发生的任何其他curses函数。

在我的endwin()调用之后,我有一些非curses日志输出,以及几个cout,但没有curses ......它距离main的末尾大约有20行。

答案 1 :(得分:2)

您应该在退出之前而不是在endwin()之前致电getch()

当您致电getch()时,会重新进入ncurses模式,并且需要再次拨打endwin()。 (请参阅man initscr:"暂时转义后调用refreshdoupdate会导致程序恢复可视模式。" getch()会自动调用{{1}除非没有对窗口进行任何更改;因为您没有关闭回显,所以窗口会被回显修改。)

我通常在wrefresh处理程序中执行endwin调用,这使得atexit()执行的可能性更大。为了更安全,您还应确保该过程不会被endwin()SIGINT等未被捕获的信号杀死,但显然您无法对SIGSEGV执行任何操作。