我正在try 用C语言编写一个程序(在Linux上),该程序循环直到用户按下一个键,但不需要按键来继续每个循环.

有没有简单的方法可以做到这一点?我想我可能用select()块就能做到,但这似乎是一个很大的工作.

或者,有没有办法在程序关闭之前捕捉到一个ctrl-c键进行清理,而不是非非阻塞io?

推荐答案

如前所述,您可以使用sigaction来捕获ctrl-c,或者使用select来捕获任何标准输入.

但是请注意,对于后一种方法,还需要设置TTY,使其处于每次字符模式,而不是每次行模式.后者是默认值——如果键入一行文本,则在按enter键之前,不会将其发送到正在运行的程序的stdin.

你需要使用tcsetattr()功能来关闭开启模式,也可能会禁用ECHO.在内存中,当程序退出时,您还必须将终端设置回ICANON模式!

为了完整起见,我刚刚编写了一些代码(注意:没有错误判断!)它设置Unix TTY并模拟DOS <conio.h>函数kbhit()getch():

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>

struct termios orig_termios;

void reset_terminal_mode()
{
    tcsetattr(0, TCSANOW, &orig_termios);
}

void set_conio_terminal_mode()
{
    struct termios new_termios;

    /* take two copies - one for now, one for later */
    tcgetattr(0, &orig_termios);
    memcpy(&new_termios, &orig_termios, sizeof(new_termios));

    /* register cleanup handler, and set the new terminal mode */
    atexit(reset_terminal_mode);
    cfmakeraw(&new_termios);
    tcsetattr(0, TCSANOW, &new_termios);
}

int kbhit()
{
    struct timeval tv = { 0L, 0L };
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(0, &fds);
    return select(1, &fds, NULL, NULL, &tv) > 0;
}

int getch()
{
    int r;
    unsigned char c;
    if ((r = read(0, &c, sizeof(c))) < 0) {
        return r;
    } else {
        return c;
    }
}

int main(int argc, char *argv[])
{
    set_conio_terminal_mode();

    while (!kbhit()) {
        /* do some work */
    }
    (void)getch(); /* consume the character */
}

C++相关问答推荐

exit(EXIT_FAILURE):Tcl C API类似功能

如何使用低级C++写出数值

fwrite无法写入满(非常大)缓冲区

文件权限为0666,但即使以超级用户身份也无法打开

解决S随机内存分配问题,实现跨进程高效数据共享

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

如何在C中使数组变量的值为常量?

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

Linux分段故障(核心转储)

当用C打印过多的';\n';时输出不正确

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

程序对大输入给出错误答案

如何打印循环调度问题的时间表

C中2个数字的加法 - 简单的人类方法

程序打印一些随机空行

中位数和众数不正确

使用复合文字数组初始化的指针数组

当循环变量在溢出时未定义时,可以进行哪些优化?

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?