我有这个程序:
#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();
}
&#39; ls -l&#39;输出中的每一行命令被错误打印如下:
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()
行(或我的情况下为newterm())之前使用def_shell_mode(),并在system("ls -l");
之前使用reset_shell_mode(),但问题仍然存在。
我能解决这个问题的唯一方法就是使用
system("reset");
在system("ls -l");
行之前。
任何人都知道真正的问题是什么,以及如何在没有它的情况下解决它&#34;重置&#34;调用
谢谢!
答案 0 :(得分:1)
您的程序将同一个终端初始化为curses模式两次。但是它第一次将终端设置为从熟模式开始的原始模式。第二次它已经处于原始模式。 (很多)那些是单独的流并不重要,但它们连接到相同的终端驱动程序。
初始化第二个屏幕(标准输出),然后执行“恢复”,没有任何反应,因为它恢复到原始模式。
您可以在执行endwin
之前切换回标准错误屏幕来“修复”它。另外,您在将shell模式终端设置从一个屏幕复制到另一个屏幕时遇到问题。