我下面有一些代码可以正常工作,但是仅当我在Linux上执行ctrl + z而不退出ctrl + d(EOF)时才退出?它与ncurses有关吗?我应该改用什么(ERR?),为什么呢?
#include <stdio.h>
#include <ncurses.h>
#define MAXLINE 10
// count number of chars, once it reaches certain amount
int main (void)
{
//cbreak();
// to open curses terminal
initscr();
int i, c;
// first iteration set to 1
for (i = 0; (c = getch()) != EOF; i++)
{
if (i == (MAXLINE-1))
{
printf("\r\n");
i = -1;
}
}
// to close curses terminal
endwin();
}
谢谢。
当您键入Ctrl-z时,程序没有退出,仅停留在后台。您可以使用jobs
命令看到它。您可以通过以下代码使用Ctrl-d退出程序:
#include <stdio.h>
#include <ncurses.h>
#define MAXLINE 10
// count number of chars, once it reaches certain amount
int main (void)
{
//cbreak();
// to open curses terminal
initscr();
int i, c;
// first iteration set to 1
for (i = 0; (c = getch()) != 4; i++)
{
if (i == (MAXLINE-1)) {
printf("\r\n");
i = -1;
}
}
// to close curses terminal
endwin();
}
更改在[(c = getch())!= 4
]中。 Ctrl-d的代码为4。
“为什么
EOF
(CTRL + D)无法在功能代码中执行?”
因为注释掉了cbreak()
选项,并且终端处于raw
模式。
Linux手册页上的语录(强调我的话:
raw和noraw例程将终端置于原始模式或从原始模式移出。原始模式与cbreak模式相似,因为键入的字符会立即传递给用户程序。 不同之处在于,在原始模式下,中断,退出,挂起和流控制字符都未经解释地传递,而不是生成信号。
最初,终端可以处于或不处于cbreak模式,因为该模式是继承的;因此,程序应显式调用cbreak或nocbreak。大多数使用curses的交互式程序都会设置cbreak模式。 请注意,cbreak会覆盖原始数据。
正如引号所述,在raw
模式下,中断,退出,挂起和流控制字符未经解释就传递,并且不生成相应的信号。
cbreak()
覆盖raw
模式。删除//
之前的cbreak()
以取消注释cbreak()
,它应能按需工作。
此外,您始终应显式调用cbreak()
或nocbreak()
,因为在程序启动时并不确定终端处于哪种模式。