继续运行程序,直到用户键入Ctrl + a

时间:2010-01-04 12:25:28

标签: c linux

我正在为Linux考试进行C编程。 用户按Ctrl + a(不是Ctrl + c)时,我不知道如何退出程序 例如,循环某事直到用户按Ctrl + a 谁能告诉我如何检查Ctrl +输入?

注意:我正在使用'gcc'并使用'./a.out'

运行输出

先谢谢大家!

7 个答案:

答案 0 :(得分:3)

Turbo C和C for Windows的其他实现有一个函数调用getch(),可以从键盘读取单个字符;那些会做你想做的。

在POSIX环境中,例如由Unix / Linux下的gcc编译程序实现,该功能并非直接存在。

有一个名为curses的库,它允许C程序进行全屏输出处理,并且curses中还有getch()个功能。这可能最终成为您问题的最简单答案。您需要阅读有关curses的文档,并将头文件和库链接到您的程序中。

答案 1 :(得分:3)

你有没有找到像这样的东西? 您点击ctrl + A和Enter后将不会停止此程序。

#include <stdio.h>

int main() {
    char a;
    while( a!=1 ) //Ascii code for ctrl + A == 1
    {
        a=getchar();
        printf("still looping ...\n");
    }
    printf( "HA! You pressed CTRL+A\n" );
    return 0;
}

但是如果你想在按下ctrl + A之后终止你的程序(之后没有点击输入),那么你就是:

#include <stdio.h>
#include <ncurses.h>

int main() {
    char a;
    initscr();
    raw();

    while( a!=1 )
        a=getch();

    endwin();
    return 0;
}

使用GCC编译第二个代码,请尝试以下命令:

gcc -o program.o -lncurses program.cpp

答案 2 :(得分:2)

对Ctrl-C有特殊支持,由系统转换为信号。如果您希望程序在使用其他特定组合键时立即停止,则会更加困难。

  • 您需要检查程序的标准输入,并且需要设置标准输入以使输入不被缓冲(否则在用户按下验证之前您将看不到任何输入“返回”)。后一部分将通过ioctl()调用完成,并且不可移植;

  • 您将需要线程或轮询,其中没有一个在C中非常适合。

在C中练习比这些更有趣。

答案 3 :(得分:2)

catching ctrl-c event

这篇文章回答了你的问题

答案 4 :(得分:1)

这将做你想要的:

stty intr ^a
./a.out

要获得额外的功劳,请使用适当的库函数,例如“stty intr ^ a”。 “man termios”。

答案 5 :(得分:0)

有人首先发布以下代码对我有用,但我不知道为什么他删除了他的答案。

原始链接:http://www.c.happycodings.com/Gnu-Linux/code18.html

#include <stdio.h>
#include <unistd.h>  /* sleep(1) */
#include <signal.h>

void ex_program(int sig);

int main(void) {
 (void) signal(SIGINT, ex_program);

 while(1)
  printf("sleeping .. ZZZzzzz ....\n"), sleep(1);

 return 0;
}

void ex_program(int sig) {
 printf("Wake up call ... !!! - Catched signal: %d ... !!\n", sig);
 (void) signal(SIGINT, SIG_DFL);
}

答案 6 :(得分:0)

这是将CTRL-A设置为中断以中断进程的方法。另请注意,在调用 tcsetattr 之后,CTRL-C不会破坏它。

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

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

    if ( tcgetattr(0, &termios) != -1 ) {
        termios.c_cc[VINTR] = '\x01'; /* CTRL-A */
        if ( tcsetattr(0, 0, &termios) != -1 ) {
            printf("Ready. Press CTRL-A to break this program\n");
            while ( 1 ) {
                printf("*\n");
                sleep(1);
            }
        }
    }
}