继续运行程序,直到用户键入Ctrl+;A.

继续运行程序,直到用户键入Ctrl+;A.,c,linux,C,Linux,我正在练习Linux的C编程,准备考试。 我不知道当用户按Ctrl+a(不是Ctrl+c)时如何退出程序 例如,循环某些内容直到用户按Ctrl+a 谁能告诉我如何检查Ctrl+a输入 注意:我正在使用“gcc”并使用“./a.out”运行输出 提前感谢大家 对Ctrl-C有特殊支持,系统将其转换为信号。如果您希望程序在使用另一个特定的组合键时立即停止,那么这将非常困难 您需要检查程序的标准输入,并且需要设置标准输入,以使输入不被缓冲(否则,在用户按下“返回”键验证输入之前,您不会看到任何输入)

我正在练习Linux的C编程,准备考试。 我不知道当用户按Ctrl+a(不是Ctrl+c)时如何退出程序 例如,循环某些内容直到用户按Ctrl+a 谁能告诉我如何检查Ctrl+a输入

注意:我正在使用“gcc”并使用“./a.out”运行输出


提前感谢大家

对Ctrl-C有特殊支持,系统将其转换为信号。如果您希望程序在使用另一个特定的组合键时立即停止,那么这将非常困难

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

  • 您将需要线程或轮询,在C语言中,这两种方式都不太合适


在C语言中还有比这些更有趣的东西需要练习。

Turbo C和其他Windows C实现有一个函数调用
getch()
,可以从键盘读取单个字符;你想干什么就干什么

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

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


这篇文章回答了你的问题

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

原始链接:

#包括
#包括/*睡眠(1)*/
#包括
无效ex_程序(int sig);
内部主(空){
(无效)信号(SIGINT,ex_程序);
而(1)
printf(“sleep..ZZZzzzz..\n”),sleep(1);
返回0;
}
无效ex_程序(int sig){
printf(“唤醒呼叫…!!!-捕获的信号:%d…!!\n”,sig);
(无效)信号(SIGINT、SIG_DFL);
}

这将满足您的要求:

stty intr ^a
./a.out

为了获得额外的学分,是否使用适当的库函数(例如“man termios”)来实现与“stty intr^a”等价的功能。

您是否正在寻找类似的功能??? 此程序不会停止,因为您按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设置为中断来中断进程。还要注意的是,在调用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);
            }
        }
    }
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
结构termios termios;
如果(tcgetattr(0,&termios)!=-1){
termios.c_cc[VINTR]='\x01';/*CTRL-A*/
如果(tcSettTR(0、0和termios)!=-1){
printf(“就绪。按CTRL-A可中断此程序\n”);
而(1){
printf(“*\n”);
睡眠(1);
}
}
}
}

标准C语言不支持键盘轮询,因此您必须使用特定于操作系统的工具。我添加了一个linux标记来表示这一点。sidenote/一些处理密钥处理的c代码:@Neil:除非您使用跨平台库,否则我不确定为什么会出现这种情况。这个答案有什么不对吗?我也不知道为什么有人否决了你。不管怎样,谢谢你的回答:)我在这里找到了诅咒教程对不起,Richard,我听不懂你说的:(我不是高级程序员。什么stty(和termios)我能做的就是将中断字符从control-C改为control-A。这将有助于解释它的作用;我能说,但新手可能不会。我相信,知道100%但能沟通10%的人不如知道50%但能沟通90%的人有用……理查德,我也不知道你为什么被否决。比谢谢你提出这个替代方案。顺便问一下,我的答案中的“ioctl()”应该是“tcsettr()”吗?哦,非常感谢。当我按Ctrl+a时程序退出了,但我没有收到消息“哈!你…”一个问题是为什么程序会退出,为什么当我按下Ctrl+a时“a”等于“1”?我不认为这是OP想要的。他的想法更像是一种非阻塞、异步的方式来检查来自STDIN的输入。把它想象成Ctrl-a生成信号并在程序中处理。如果我错了,请纠正我:)控制字符返回的ASCII码与字母表中的位置相同-因此Ctrl+A=1、Ctrl+C=3、Ctrl+M=13(顺便说一下是回车符)、Ctrl+G=7(顺便说一下是铃声或嘟嘟声)。我删除了我的,因为我还不确定Ctrl+A哪个信号是由Ctrl+A创建的。Ctrl+A和Ctrl+A之间没有区别
#include <stdio.h>
#include <ncurses.h>

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

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

    endwin();
    return 0;
}
gcc -o program.o -lncurses program.cpp
#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);
            }
        }
    }
}