我需要知道Linux中的哪個中斷檢查是否有任何按鍵被按下?如何檢查一個鍵是否在Linux中被按下?
回答
我假設你想在終端模擬器上(而不是在X客戶端上)這樣做,並且你不關心密鑰版本。
執行此操作的Linux方法是使用termios(3)將終端設置爲非規範或原始模式,然後使用通常的libc函數讀取stdin。
Linux上的系統調用編號位於/usr/include/asm/unistd.h(或unistd_64.h)上,但termios函數最終轉換爲ioctl()。所以,如果你因爲一些奇怪的和不尋常的原因而不能調用libc,你將不得不查找ioctl的系統調用號,以及ioctl對應的termios函數。
編輯:
顯然,你假設Linux使用相同的模型DOS,其中控制檯輸入是鍵盤的抽象(與像的keyPressed,GETC功能,...)而控制檯輸出是面向字符顯示的抽象。
Unix/Linux的抽象是關於終端,它可以是物理控制檯,串口上的終端(或終端仿真器),xterm,...這裏重要的一點是,默認情況下,輸入行直到終端(或終端仿真器)看到一個行分隔符時纔會被提供給程序。
在POSIX上,這些終端受termios(3)
功能的控制。 Linux的最終翻譯那些的ioctl()調用,如下(見tty_ioctl(4)
):
- tcgetattr(FD,ARG)=>的ioctl(FD,TCGETS,ARG)
- tcsetattr(FD,TCSANOW,精氨酸)=>的ioctl(FD,TCSETS,ARG)
- tcsetattr(FD,TCSADRAIN,ARG)=>的ioctl(FD,TCSETSW,ARG)
- tcsetattr(FD,TCSAFLUSH,ARG)=>的ioctl(FD,TCSETSF ,arg)
- ...
所以,一個C程序做你要的是什麼,使用termios(3)
和poll(2)
(檢查剝離的簡潔和清晰的錯誤):現在
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <poll.h>
#include <signal.h>
#include <termios.h>
#include <sys/ioctl.h>
static sig_atomic_t end = 0;
static void sighandler(int signo)
{
end = 1;
}
int main()
{
struct termios oldtio, curtio;
struct sigaction sa;
/* Save stdin terminal attributes */
tcgetattr(0, &oldtio);
/* Make sure we exit cleanly */
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = sighandler;
sigaction(SIGINT, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
/* This is needed to be able to tcsetattr() after a hangup (Ctrl-C)
* see tcsetattr() on POSIX
*/
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = SIG_IGN;
sigaction(SIGTTOU, &sa, NULL);
/* Set non-canonical no-echo for stdin */
tcgetattr(0, &curtio);
curtio.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &curtio);
/* main loop */
while (!end) {
struct pollfd pfds[1];
int ret;
char c;
/* See if there is data available */
pfds[0].fd = 0;
pfds[0].events = POLLIN;
ret = poll(pfds, 1, 0);
/* Consume data */
if (ret > 0) {
printf("Data available\n");
read(0, &c, 1);
}
}
/* restore terminal attributes */
tcsetattr(0, TCSANOW, &oldtio);
return 0;
}
,ioctl
和poll
是系統調用,你可以找到關於他們的人數/ usr/include/asm/unistd.h(x86上的54和168)和/usr/include/asm/ioctls.h具有您需要的ioctl常量(在x86上:TCGETS = 0x5401,TCSETS = 0x5402,TCSETSW = 0x5403, TCSETSF = 0x5404)。
我想使用中斷服務。我知道dos中斷有這樣的服務,所以我認爲這也適用於linux ... – Sason 2010-10-19 08:05:03
不,ninjalj已經描述了你需要的東西。在Linux(i386體系結構)上,可以使用int 0x80與eax中的服務編號進行系統調用。但是,與DOS不同,沒有直接調用「檢查按鍵是否被按下」。由於原因,請參閱http://en.wikipedia.org/wiki/Ring_%28computer_security%29和http://en.wikipedia。組織/維基/ User_space。類Unix系統使用終端抽象,除非你想修改Linux本身,否則你必須遵循ninjalj的指示。 – 2010-10-19 22:10:19
- 1. 如何檢查一次是否有多個按鍵被按下?
- 2. 檢查某個鍵是否被按下?
- 3. 檢查一個按鍵是否被按下兩次
- 4. 檢查ALT鍵是否被按下
- 5. xlib XNextEvent檢查鍵是否被按下
- 6. 檢查DELETE鍵是否被按下?
- 7. 檢查鍵是否被按下硒
- 8. 如何檢查一個按鈕是否被按下(在一個jsp文件中)
- 9. 如何無休止地檢查按鍵是否被按下?
- 10. 如何檢查一個鍵是否正在按下
- 11. 檢查一個按鈕是否在python中被按下?
- 12. 如何檢查jPanel是否被按下?
- 13. 如何檢測某個特定按鍵是否被按下?
- 14. 如何檢查用戶在按下另一個鍵時是否按住了鍵?
- 15. Python 2.7 - 如何檢查SHIFT-KEY或CTRL +鍵是否被按下?
- 16. 如何檢查左尖括號鍵是否被按下?
- 17. 如何檢查一個鍵修飾符是否被按下(shift,ctrl,alt)?
- 18. 如何檢測Java 2d中的按鍵是否被按下?
- 19. 檢查後退鍵是否在android中被按下?
- 20. 檢查是否按下回車鍵在Linux bash腳本
- 21. 如何檢測是否有任何按鍵被按下
- 22. 如何檢查批次中是否按下了某個鍵?
- 23. 檢查按鈕是否被按下
- 24. Emu8086檢查按鍵是否按下
- 25. 如何檢查是否一個類型的鍵盤鍵是按下與CTRL
- 26. 如何檢測Windows按鍵是否被按下?
- 27. 檢查是否沒有按鍵被按下
- 28. 有沒有辦法檢測一個鍵是否被按下?
- 29. 如何判斷某個鍵是否在Python中被按下?
- 30. 檢測BlackBerry按鍵球/按鍵是否被按下?
你不應該做一個系統調用來做到這一點嗎? – 2010-10-18 18:42:24
Linux中的系統調用ARE中斷。 – 2010-10-18 19:00:55
投票結束,因爲不清楚。用什麼語言?做什麼? C版本:http://stackoverflow.com/questions/2984307/c-key-pressed-in-linux-console – 2016-07-02 10:38:34