Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中实现按键事件_C_Multithreading_Keypress - Fatal编程技术网

在C语言中实现按键事件

在C语言中实现按键事件,c,multithreading,keypress,C,Multithreading,Keypress,我有一个无限循环,就像下面的循环一样,在这个循环中,我想不断地检查键盘,看看是否按下了ESC键。如果按下,则应断开回路。我怎么能在C语言中做到这一点?我使用的是gcc,如果必须通过线程访问pthreads,我也会访问pthreads while(1){ //do something //check for the ESC key } 如果您正在做的主要工作可以放在这个主循环中,那么您可以在非阻塞模式下使用STDIN。您仍然有一个终端的问题,该终端正常进行线路

我有一个无限循环,就像下面的循环一样,在这个循环中,我想不断地检查键盘,看看是否按下了ESC键。如果按下,则应断开回路。我怎么能在C语言中做到这一点?我使用的是gcc,如果必须通过线程访问pthreads,我也会访问pthreads

 while(1){
        //do something
        //check for the ESC key
 }

如果您正在做的主要工作可以放在这个主循环中,那么您可以在非阻塞模式下使用STDIN。您仍然有一个终端的问题,该终端正常进行线路缓冲。您还应将终端置于原始模式

使用Ctrl-C中断怎么样

非阻塞意味着读取系统调用总是立即返回,即使文件中没有新字节。在Linux/Unix上,可以通过以下方式使STDIN非阻塞:

#include <unistd.h>
#include <fcntl.h>
fcntl(0, F_SETFL, O_NONBLOCK); /* 0 is the stdin file decriptor */

如果您正在做的主要工作可以放在这个主循环中,那么您可以在非阻塞模式下使用STDIN。您仍然有一个终端的问题,该终端正常进行线路缓冲。您还应将终端置于原始模式

使用Ctrl-C中断怎么样

非阻塞意味着读取系统调用总是立即返回,即使文件中没有新字节。在Linux/Unix上,可以通过以下方式使STDIN非阻塞:

#include <unistd.h>
#include <fcntl.h>
fcntl(0, F_SETFL, O_NONBLOCK); /* 0 is the stdin file decriptor */

这严重依赖于系统。在Unix/Linux系统中,默认的终端处理程序收集行,并仅在按下Enter键后有完整行可用时通知程序。如果您希望立即按键,则需要将终端置于非规范模式:

#include <termios.h>

struct termios info;
tcgetattr(0, &info);          /* get current terminal attirbutes; 0 is the file descriptor for stdin */
info.c_lflag &= ~ICANON;      /* disable canonical mode */
info.c_cc[VMIN] = 1;          /* wait until at least one keystroke available */
info.c_cc[VTIME] = 0;         /* no timeout */
tcsetattr(0, TCSANOW, &info); /* set immediately */
完成后,您可能希望确保将终端设置回规范模式,以免其他程序(如shell)混淆:

tcgetattr(0, &info);
info.c_lflag |= ICANON;
tcsetattr(0, TCSANOW, &info);

您还可以使用tcsetattr执行其他操作-有关详细信息,请参阅手册页。有一件事可能足以满足您的目的,那就是设置一个可选的下线字符。

这严重依赖于系统。在Unix/Linux系统中,默认的终端处理程序收集行,并仅在按下Enter键后有完整行可用时通知程序。如果您希望立即按键,则需要将终端置于非规范模式:

#include <termios.h>

struct termios info;
tcgetattr(0, &info);          /* get current terminal attirbutes; 0 is the file descriptor for stdin */
info.c_lflag &= ~ICANON;      /* disable canonical mode */
info.c_cc[VMIN] = 1;          /* wait until at least one keystroke available */
info.c_cc[VTIME] = 0;         /* no timeout */
tcsetattr(0, TCSANOW, &info); /* set immediately */
完成后,您可能希望确保将终端设置回规范模式,以免其他程序(如shell)混淆:

tcgetattr(0, &info);
info.c_lflag |= ICANON;
tcsetattr(0, TCSANOW, &info);
您还可以使用tcsetattr执行其他操作-有关详细信息,请参阅手册页。有一件事可能足以满足您的目的,那就是设置一个可选的下线字符。

这就是您想要的:

#include <stdio.h>
#include <conio.h>

void main() {

   int c;

   while((c = getch()) != EOF )
      if(c == 27)   break;
/* 27 is the ASCII code for Esc */

}
这就是你想要的:

#include <stdio.h>
#include <conio.h>

void main() {

   int c;

   while((c = getch()) != EOF )
      if(c == 27)   break;
/* 27 is the ASCII code for Esc */

}

试试whilech=getchar!=ESC\u ASCCI\u Code在您连续执行其他操作时,是否继续检查键盘@ᴍ阿伦ᴍaroun谢谢,但是使用这种方法,每次循环停止以获取角色时。我不想停下来检查键盘。@SzG我实际上需要一个按键事件。看起来我需要一个中断处理器。这是什么系统?Linux?请更新标记。请尝试whilech=getchar!=ESC\u ASCCI\u Code在您连续执行其他操作时,是否继续检查键盘@ᴍ阿伦ᴍaroun谢谢,但是使用这种方法,每次循环停止以获取角色时。我不想停下来检查键盘。@SzG我实际上需要一个按键事件。看起来我需要一个中断处理器。这是什么系统?Linux?请更新标签。谢谢!事实上,我想使用像Ctrl-C这样的东西,但要使用另一个像ESC这样的键。你能解释更多关于非阻塞模式下STDIN的信息吗?谢谢!事实上,我想使用像Ctrl-C这样的东西,但要使用另一个像ESC这样的键。你能解释一下非阻塞模式下的STDIN吗?