NCURSES - 在 tty 模式下打印时错印新行

NCURSES - missprinting new lines when printing in tty mode

我有这个程序:

#include <ncurses.h>

SCREEN * sstderr;
SCREEN * sstdout;

int main() {
    sstderr = newterm(NULL, stderr, NULL);
    noecho();
    sstdout = newterm(NULL, stdout, stdin);
    set_term(sstdout);

    addstr("PRESS A KEY");
    getch();
    def_prog_mode();
    endwin();

    system("ls -l");

    getchar();
    reset_prog_mode();
    refresh();
    addstr("Press another key");
    getch();
    set_term(sstdout);
    endwin();
    set_term(sstderr);
    endwin();
}

'ls -l' 命令输出中的每一行都会像这样打印错误:

drwxr-xr-x   2 root root    4096 Feb 11 09:22 bin
                        drwxr-xr-x   3 root root    4096 Mar  6  2016 boot
                                                drwxr-xr-x  18 root root    3380 Feb 23 00:12 dev
                                                                        drwxr-xr-x 113 root root   12288 Apr 25 10:45 etc
...

我尝试在 initscr() 行之前使用 def_shell_mode() (在我的例子中是 newterm() ),在 system("ls -l"); 之前使用 reset_shell_mode() 但是问题仍然存在。 我可以解决这个问题的唯一方法是使用

system("reset");

就在 system("ls -l"); 行之前。

有人知道真正的问题是什么吗?如果没有那个 "reset" 电话,我该如何解决?

谢谢!

您的程序两次将同一个终端初始化为 curses 模式。但是它第一次将终端设置为从熟模式开始的原始模式。第二次它已经处于原始模式。这些是独立的流并不重要(很多),但它们连接到同一个终端驱动程序。

初始化第二个屏幕(用于标准输出),然后执行 "restore",没有任何反应,因为它恢复到原始模式。

您可以 "fix" 在执行 endwin 之前切换回标准错误屏幕。副手,将 shell 模式终端设置从一个屏幕复制到另一个屏幕时会遇到问题。