#include <stdio.h>
#include <linux/input.h>
#include <fcntl.h>
#include <unistd.h>
#define DEV_PATH "/dev/input/event5" //根據(jù)需要修改為你的鍵盤對(duì)應(yīng)的設(shè)備文件,可以直接sudo cat /dev/input/event5并按鍵盤,看是否有輸出,見附圖
int main()
{
int keys_fd; //文件標(biāo)志
char ret[2];
struct input_event t; //讀取到的input設(shè)備數(shù)據(jù)是一個(gè)結(jié)構(gòu)體
keys_fd = open(DEV_PATH, O_RDONLY); //權(quán)限不通過的時(shí)候一般會(huì)返回-1
if(keys_fd <= 0)
{
printf("open /dev/input/event2 device error!\n");
return -1;
}
while(1)
{
if(
read(keys_fd, &t, sizeof(t)) == sizeof(t)
) /*keys_fd指向打開的設(shè)備文件,read將從設(shè)備文件傳送sizeof(t)個(gè)字節(jié)的數(shù)據(jù)到&t這個(gè)內(nèi)存地址。函數(shù)執(zhí)行順利的話返回值是實(shí)際讀取的字節(jié)數(shù)*/
{
if(t.type == EV_KEY)
{
if(t.value==0 || t.value==1)
{
printf("key %d %s\n", t.code, (t.value) ? "Pressed" : "Released"); //t.code值所對(duì)應(yīng)的按鍵在/usr/include/linux/input-event-codes.h可以查到
}
}
}
}
close(keys_fd);
return 0;
}

附圖
操作其他的設(shè)備類似,不過要提前了解相關(guān)的數(shù)據(jù)結(jié)構(gòu)
但是這種監(jiān)聽是需要有設(shè)備文件的讀取權(quán)限的(默認(rèn)root用戶才有),read函數(shù)是系統(tǒng)函數(shù),阻塞地讀取設(shè)備文件,當(dāng)設(shè)備文件中的緩存為空時(shí)掛起等待。
推薦Linux全局事件監(jiān)聽技術(shù)