![](/img/trans.png)
[英]getchar() doesn't pass EOF and Ctrl+Z doesn't terminate the program on Cygwin
[英]Why doesn't EOF (ctrl+d) execute in function code? And only ctrl+z
我下面有一些代码可以正常工作,但只有当我在 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 ) 不在 function 代码中执行?”
因为您注释掉了cbreak()
选项并且终端处于raw
模式。
Linux 手册页中的引用(强调我的):
raw 和 noraw 例程将终端置于或退出原始模式。 原始模式类似于 cbreak 模式,因为键入的字符会立即传递给用户程序。 不同之处在于,在原始模式下,中断、退出、挂起和流控制字符都是未经解释地传递的,而不是生成信号。
最初终端可能处于也可能不处于 cbreak 模式,因为该模式是继承的; 因此,程序应该显式调用 cbreak 或 nocbreak。 大多数使用 curses 的交互式程序都设置了 cbreak 模式。 请注意,cbreak 会覆盖 raw。
正如引号所说,在raw
模式下,中断、退出、挂起和流控制字符未经解释地通过,并且不会生成相应的信号。
cbreak()
覆盖raw
模式。 删除//
前面的cbreak()
以取消注释cbreak()
,它将按需要工作。
除此之外,您始终应该显式调用cbreak()
或nocbreak()
,因为在程序启动时无法确定终端处于何种模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.