在C中获取键盘中断

程序:

#include<stdio.h> void main() { int time=1800; while(1){ system("clear"); time-=1; printf("%d\n",time); sleep(1); if(time==0) pause(); } } 

上面的程序在时间到达0时停止。我的要求是在程序运行期间,如果我按下空格键或任何其他键的任何一个键,程序会暂停,再一次按下键,程序会恢复。 为此,在执行while条件之前,我们提交键盘中断的信号处理程序。 在C如何做到这一点。

什么是用来获得键盘中断的function。 我不想从用户获得input,我想通过键盘来处理用户产生的中断。

提前致谢..,

Solutions Collecting From Web of "在C中获取键盘中断"

键盘不存在于纯粹的标准C99或C11中( stdin不是键盘,可能是一个管道(7),所以并不总是一个tty(4) ;你可以从/dev/tty读取…)。

所以,它要简单得多,而且是特定于操作系统的。 我专注于Linux。

阅读更多有关ttys,特别是阅读tty揭秘 。 请注意,tty通常处于熟化模式, 内核缓冲行(除了行缓存)。

合理的方法是使用像ncurses或readline这样的终端库。 这些库是在原始模式下设置tty(你可以自己做,看看这个和termios(3) ;你可能还需要poll(2) )。 确保在退出之前正确退出并将tty重置为已烹饪模式。

但是你的生活可能太短,不能潜入termios(3)和tty_ioctl(4),所以只需使用ncursesreadline

你也可以考虑一些GUI应用程序(例如在X11或Wayland之上)。 然后使用一个工具包( GTK , Qt ,…)。

我的要求是在程序运行期间,如果我按下空格键或任何其他键的任何键,程序会暂停,再次按下键,程序会恢复。

你可以用这种类型的代码实现这一点

 #include <stdio.h> int main() { char i;int y=0; while(1) { if(!(_kbhit())) { y=0; printf("//key is not pressed"); //do what you want } else { printf("key pressed (execution pause) , press again to resume"); i=_getch(); y=1; } if(y==1) { getch(); } } return 0; } 

您需要conio.h。它定义kbhit()和getch()都等待键盘输入。

每当调用kbhit()时,它将检查键盘缓冲区,如果缓冲区有任何按键,则返回非零值,否则返回0。

conio.h由MSDOS编译器使用,不是标准C库(ISO)的一部分。 这在POSIX中也没有定义。

 #include<stdio.h> #include<conio.h> int main() { while(1) { while(!kbhit()) { //works continuously until interrupted by keyboard input. printf("M Tired. Break Me\n"); } getch(); } return 0; } 

对于linux,您可以使用下面的代码片段来实现kbhit(),通过使用fnctl.h中的fnctl()来进行信号处理:

  #include <termios.h> #include <unistd.h> #include <fcntl.h> int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; }