關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 基于Linux內(nèi)核的鍵盤(pán)模擬實(shí)現(xiàn)

基于Linux內(nèi)核的鍵盤(pán)模擬實(shí)現(xiàn)

作者: 時(shí)間:2012-08-17 來(lái)源:網(wǎng)絡(luò) 收藏

底層tty驅(qū)動(dòng)調(diào)用receive_buf()這個(gè)函數(shù)用來(lái)發(fā)送硬件設(shè)備接收處理的字符。參見(jiàn)/usr/src/linux/drivers/char/n_tty.c:

本文引用地址:http://www.butianyuan.cn/article/202221.htm

static void n_tty_receive_buf(struct tty_struct *tty, const

unsigned char *cp, char *fp, int count)

參數(shù)cp是一個(gè)指向設(shè)備接收的輸入字符的buffer的指針。參數(shù)fp是一個(gè)指向一個(gè)標(biāo)記字節(jié)指針的指針。在具體的實(shí)現(xiàn)中,先保存原始的tty receive_buf()函數(shù),然后重置ldisc.receive_buf到自定義的new_receive_buf()函數(shù)來(lái)記錄用戶的輸入。

例如:要記錄在終端tty1設(shè)備上的輸入。

int fd = open(/dev/tty1, O_RDONLY, 0);

struct file *file = fget(fd);

struct tty_struct *tty = file->private_data;

//保存原始的receive_buf()函數(shù)

old_receive_buf = tty->ldisc.receive_buf;

//替換成新的new_receive_buf函數(shù)

tty->ldisc.receive_buf = new_receive_buf;

//新的new_receive_buf函數(shù)

void new_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)

{

logging(tty, cp, count);

//紀(jì)錄用戶擊鍵

/* 調(diào)用回原來(lái)的receive_buf */

(*old_receive_buf)(tty, cp, fp, count);

}

4.4 tty_read函數(shù)

當(dāng)一個(gè)進(jìn)程需要通過(guò)sys_read()函數(shù)來(lái)讀取一個(gè)tty終端的輸入字符時(shí),tty_read函數(shù)就會(huì)被調(diào)用。參見(jiàn)文件/usr/src/linux/drives/char/tty_io.c:

static ssize_t tty_read(struct file * file, char * buf, size_t count,

loff_t *ppos)

5 結(jié)束語(yǔ)

目前,利用勾子函數(shù)實(shí)現(xiàn)基于的這種方法使用非常靈活,同時(shí)也可以跨平臺(tái)進(jìn)行移植,可通過(guò)tty和pts來(lái)記錄下本地和遠(yuǎn)程會(huì)話的所有擊鍵動(dòng)作,并且也支持一些特殊的按鍵。當(dāng)然,要使更靈活,下一步還需要更多的改進(jìn),例如增加多種不同日志記錄模式的支持等。

更多計(jì)算機(jī)與外設(shè)信息請(qǐng)關(guān)注21ic計(jì)算機(jī)與外設(shè)頻道

linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)

DIY機(jī)械鍵盤(pán)相關(guān)社區(qū):機(jī)械鍵盤(pán)DIY


linux相關(guān)文章:linux教程



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: Linux 內(nèi)核 鍵盤(pán) 模擬

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉