为什么EOF(ctrl + d)无法在功能代码中执行?而且只有ctrl + z

问题描述 投票:0回答:2

我下面有一些代码可以正常工作,但是仅当我在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();
}

谢谢。

c linux input ncurses curses
2个回答
0
投票

当您键入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。


0
投票

“为什么EOFCTRL + D)无法在功能代码中执行?”

因为注释掉了cbreak()选项,并且终端处于raw模式。

Linux手册页上的语录(强调我的话:

raw和noraw例程将终端置于原始模式或从原始模式移出。原始模式与cbreak模式相似,因为键入的字符会立即传递给用户程序。 不同之处在于,在原始模式下,中断,退出,挂起和流控制字符都未经解释地传递,而不是生成信号

来源:https://linux.die.net/man/3/raw


最初,终端可以处于或不处于cbreak模式,因为该模式是继承的;因此,程序应显式调用cbreak或nocbreak。大多数使用curses的交互式程序都会设置cbreak模式。 请注意,cbreak会覆盖原始数据。

来源:https://linux.die.net/man/3/cbreak

正如引号所述,在raw模式下,中断,退出,挂起和流控制字符未经解释就传递,并且不生成相应的信号。

cbreak()覆盖raw模式。删除//之前的cbreak()以取消注释cbreak(),它应能按需工作。

此外,您始终应显式调用cbreak()nocbreak(),因为在程序启动时并不确定终端处于哪种模式。

© www.soinside.com 2019 - 2024. All rights reserved.