亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于Linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法及系統(tǒng)與流程

文檔序號(hào):11620383閱讀:457來(lái)源:國(guó)知局
基于Linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法及系統(tǒng)與流程

本發(fā)明涉及l(fā)inux系統(tǒng)驅(qū)動(dòng)領(lǐng)域,尤其涉及一種基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法及系統(tǒng)。



背景技術(shù):

按鍵是在開(kāi)發(fā)中最常使用的人機(jī)交互的方式之一,幾乎絕大多數(shù)設(shè)備都具備有按鍵這種輸入方法。但是現(xiàn)有技術(shù)中的按鍵監(jiān)聽(tīng)不能有效檢測(cè)且不能確保按鍵的檢測(cè)成功率。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明要解決的技術(shù)問(wèn)題在于針對(duì)現(xiàn)有技術(shù)中按鍵監(jiān)聽(tīng)不能有效檢測(cè)且不能確保按鍵的檢測(cè)成功率的缺陷,提供一種在有效達(dá)到檢測(cè)按鍵目的的同時(shí)又能夠有效確保按鍵的檢測(cè)成功率的基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法及系統(tǒng)。

本發(fā)明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是:

提供一種基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法,包括以下步驟:

操作系統(tǒng)打開(kāi)預(yù)設(shè)路徑下的按鍵監(jiān)聽(tīng)文件,該按鍵監(jiān)聽(tīng)文件對(duì)應(yīng)被linux內(nèi)核虛擬化為設(shè)備節(jié)點(diǎn)的指定按鍵,該按鍵監(jiān)聽(tīng)文件包括一個(gè)用于監(jiān)聽(tīng)該指定按鍵的自定義函數(shù),該自定義函數(shù)中設(shè)置了檢測(cè)按鍵的輪詢(xún)周期以及上報(bào)按鍵狀態(tài)的事件函數(shù);

操作系統(tǒng)根據(jù)所述設(shè)置的輪詢(xún)周期以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件,并將該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取到預(yù)設(shè)變量中;

若讀取成功,則判斷該預(yù)設(shè)變量中的內(nèi)容是否為預(yù)設(shè)值,該預(yù)設(shè)值對(duì)應(yīng)指定按鍵被按下或者抬起的狀態(tài)值,若是,則根據(jù)所述事件函數(shù)將按鍵狀態(tài)上報(bào)。

接上述技術(shù)方案,所述按鍵監(jiān)聽(tīng)文件預(yù)存在linux系統(tǒng)的設(shè)備文件中。

接上述技術(shù)方案,若該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取成功,則返回大于等于0的值,若讀取失敗則返回小于0的值。

接上述技術(shù)方案,若該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取失敗,則調(diào)用預(yù)設(shè)的打印函數(shù)打印錯(cuò)誤信息。

接上述技術(shù)方案,操作系統(tǒng)以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件時(shí),每完成一次輪詢(xún)周期,則將所述檢測(cè)按鍵的輪詢(xún)周期傳遞給一延時(shí)函數(shù)來(lái)實(shí)現(xiàn)延時(shí),延時(shí)結(jié)束后再進(jìn)入下一次的輪詢(xún)周期。

接上述技術(shù)方案,具體通過(guò)函數(shù)指針的形式將按鍵狀態(tài)上報(bào)。

本發(fā)明還提供了一種基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)系統(tǒng),包括:

監(jiān)聽(tīng)文件設(shè)置模塊,用于將指定按鍵通過(guò)linux內(nèi)核虛擬化為設(shè)備節(jié)點(diǎn),該設(shè)備節(jié)點(diǎn)表現(xiàn)為按鍵監(jiān)聽(tīng)文件,該按鍵監(jiān)聽(tīng)文件包括一個(gè)用于監(jiān)聽(tīng)該指定按鍵的自定義函數(shù),該自定義函數(shù)中設(shè)置了檢測(cè)按鍵的輪詢(xún)周期以及上報(bào)按鍵狀態(tài)的事件函數(shù);

讀取模塊,用于通過(guò)操作系統(tǒng)根據(jù)所述設(shè)置的輪詢(xún)周期以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件,并將該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取到預(yù)設(shè)變量中;

監(jiān)聽(tīng)模塊,用于在讀取模塊讀取成功時(shí),判斷該預(yù)設(shè)變量中的內(nèi)容是否為預(yù)設(shè)值,該預(yù)設(shè)值對(duì)應(yīng)指定按鍵被按下或者抬起的狀態(tài)值,若是,則根據(jù)所述事件函數(shù)將按鍵狀態(tài)上報(bào)。

接上述技術(shù)方案,所述按鍵監(jiān)聽(tīng)文件預(yù)存在linux系統(tǒng)的設(shè)備文件中。

接上述技術(shù)方案,該系統(tǒng)還包括延時(shí)模塊,用于在操作系統(tǒng)以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件時(shí),每完成一次輪詢(xún)周期,則將所述檢測(cè)按鍵的輪詢(xún)周期傳遞給一延時(shí)函數(shù)來(lái)實(shí)現(xiàn)延時(shí),延時(shí)結(jié)束后再進(jìn)入下一次的輪詢(xún)周期。

接上述技術(shù)方案,所述監(jiān)聽(tīng)模塊具體通過(guò)函數(shù)指針的形式將按鍵狀態(tài)上報(bào)。

本發(fā)明產(chǎn)生的有益效果是:本發(fā)明的按鍵的監(jiān)聽(tīng)方法通過(guò)linux系統(tǒng)來(lái)實(shí)施,通過(guò)將按鍵在linux內(nèi)核層中虛擬成一個(gè)設(shè)備節(jié)點(diǎn),操作系統(tǒng)通過(guò)輪詢(xún)的方式讀取該設(shè)備節(jié)點(diǎn)文件的值來(lái)判定按鍵是否被按下或者抬起,本發(fā)明能夠有效的檢測(cè)系統(tǒng)中物理按鍵的按下或者抬起情況。在有效的達(dá)到檢測(cè)按鍵目的的同時(shí)又能夠有效的確保按鍵的檢測(cè)成功率。

附圖說(shuō)明

下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明,附圖中:

圖1是本發(fā)明實(shí)施例基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法的流程圖;

圖2是本發(fā)明另一實(shí)施例基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法的流程圖;

圖3是本發(fā)明實(shí)施例基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)系統(tǒng)結(jié)構(gòu)示意圖;

圖4是本發(fā)明另一實(shí)施例基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)系統(tǒng)結(jié)構(gòu)示意圖;

圖5是本發(fā)明第三實(shí)施例基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)系統(tǒng)結(jié)構(gòu)示意圖。

具體實(shí)施方式

為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。

以下先對(duì)相關(guān)名詞進(jìn)行解釋?zhuān)?/p>

linux:是一套免費(fèi)使用和自由傳播的類(lèi)unix操作系統(tǒng),是一個(gè)基于posix和unix的多用戶(hù)、多任務(wù)、支持多線程和多cpu的操作系統(tǒng)。它能運(yùn)行主要的unix工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。linux繼承了unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個(gè)性能穩(wěn)定的多用戶(hù)網(wǎng)絡(luò)操作系統(tǒng)。

本發(fā)明在內(nèi)核層中提出了一套監(jiān)聽(tīng)系統(tǒng)按鍵的方法,能夠有效的檢測(cè)系統(tǒng)中物理按鍵被按下或者抬起的情況。

本發(fā)明的一個(gè)實(shí)施例中,如圖1所示,基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)方法包括以下步驟:

s101、操作系統(tǒng)打開(kāi)預(yù)設(shè)路徑下的按鍵監(jiān)聽(tīng)文件,該按鍵監(jiān)聽(tīng)文件對(duì)應(yīng)被linux內(nèi)核虛擬化為設(shè)備節(jié)點(diǎn)的指定按鍵,該按鍵監(jiān)聽(tīng)文件包括一個(gè)用于監(jiān)聽(tīng)該指定按鍵的自定義函數(shù),該自定義函數(shù)中設(shè)置了檢測(cè)按鍵的輪詢(xún)周期以及上報(bào)按鍵狀態(tài)的事件函數(shù);

s102、操作系統(tǒng)根據(jù)設(shè)置的輪詢(xún)周期以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件,并將該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取到預(yù)設(shè)變量中;

s103、若讀取成功,則判斷該預(yù)設(shè)變量中的內(nèi)容是否為預(yù)設(shè)值,該預(yù)設(shè)值對(duì)應(yīng)指定按鍵被按下或者抬起的狀態(tài)值,若是,則執(zhí)行步驟s104;

s104、根據(jù)事件函數(shù)將按鍵狀態(tài)上報(bào),具體上報(bào)給系統(tǒng)應(yīng)用層。

優(yōu)選地,按鍵監(jiān)聽(tīng)文件預(yù)存在linux系統(tǒng)的設(shè)備文件中。

進(jìn)一步地,若該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取成功,則可返回大于等于0的值,若讀取失敗則返回小于0的值。

如圖2所示,還包括步驟s105、若該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取失敗,則調(diào)用預(yù)設(shè)的打印函數(shù)打印錯(cuò)誤信息。

步驟s102中,操作系統(tǒng)以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件時(shí),每完成一次輪詢(xún)周期,則將檢測(cè)按鍵的輪詢(xún)周期傳遞給一延時(shí)函數(shù)來(lái)實(shí)現(xiàn)延時(shí),延時(shí)結(jié)束后再進(jìn)入下一次的輪詢(xún)周期。

步驟s104中,可具體通過(guò)函數(shù)指針的形式將按鍵狀態(tài)上報(bào)給系統(tǒng)應(yīng)用層。函數(shù)指針中可設(shè)計(jì)一個(gè)類(lèi)型變量,這樣就能夠?qū)⒏鞣N各樣的按鍵事件上報(bào)出去。這種設(shè)計(jì)大大提高了該函數(shù)的擴(kuò)展性,對(duì)于后期其他按鍵事件的擴(kuò)展起到了非常好的兼容作用。

本發(fā)明的一個(gè)較佳實(shí)施例中,可設(shè)計(jì)一個(gè)用于監(jiān)聽(tīng)該指定按鍵的自定義函數(shù)set_key_listener(longdelt_time,void((void*))key_fun(intfun_type)),該函數(shù)中delt_time表示的是檢測(cè)按鍵的時(shí)間片段,即輪詢(xún)周期,key_fun表示的是檢測(cè)到按鍵后的回調(diào)函數(shù),fun_type表示上報(bào)的按鍵事件信息。

所設(shè)計(jì)的自定義函數(shù)set_key_listener(longdelt_time,void((void*))key_fun(intfun_type))的實(shí)現(xiàn)邏輯方法如下:

1、在check_key.h文件中定義函數(shù)申明

在c語(yǔ)言開(kāi)發(fā)過(guò)程中需要將函數(shù)的定義存放在check_key.h頭文件中,這樣后續(xù)就能夠引用頭文件的方式來(lái)調(diào)用頭文件中包含的函數(shù)了。本實(shí)施例中在頭文件中申明的方法如下所示:

set_key_listener(longdelt_time,void((void*))key_fun(intfun_type));

接下來(lái)對(duì)該方法做一個(gè)簡(jiǎn)單的說(shuō)明。set_key_listener是定義的函數(shù)的名稱(chēng),該函數(shù)中包含2個(gè)參數(shù),其一是delt_time,這個(gè)參數(shù)表示的是按鍵的檢測(cè)的輪詢(xún)周期,((void*))key_fun(intfun_type)表示的是函數(shù)的回調(diào)信息,當(dāng)檢測(cè)到按鍵事件后就通過(guò)((void*))key_fun(intfun_type)函數(shù)指針的方式將按鍵信息傳遞出去。

優(yōu)勢(shì)分析:

a)將函數(shù)的定義存放在check_key.h的頭文件中,這樣后續(xù)在使用的時(shí)候僅僅需要通過(guò)include語(yǔ)句引用頭文件即可實(shí)現(xiàn)函數(shù)的調(diào)用

b)設(shè)計(jì)了delt_time變量,這樣在按鍵的檢測(cè)周期中可以通過(guò)外部delt_time變量的值來(lái)精細(xì)的調(diào)節(jié)內(nèi)部的檢測(cè)周期,確保了按鍵檢測(cè)的精度需求和資源開(kāi)銷(xiāo)的平衡。

c)通過(guò)((void*))key_fun(intfun_type)函數(shù)指針的形式將按鍵的類(lèi)型信息傳遞給外界,暴露按鍵的狀態(tài)流程。

2、按鍵輪詢(xún)檢測(cè)方法

本實(shí)施例中通過(guò)按鍵輪詢(xún)的方式來(lái)進(jìn)行按鍵檢測(cè),輪詢(xún)方法就是不斷地檢測(cè)按鍵是否被按下。在linux系統(tǒng)中一切皆文件,所以按鍵被內(nèi)核虛擬成一個(gè)設(shè)備節(jié)點(diǎn)并且掛在在/dev/input/even文件下,通過(guò)不斷讀取該文件的值來(lái)判定按鍵是否被按下。

接下來(lái)描述一下如何讀取/dev/input/even設(shè)備文件的。通過(guò)調(diào)用系統(tǒng)體用的open方法來(lái)打開(kāi)一個(gè)設(shè)備文件,具體是intkey_fd=open("/dev/input/event",o_rdonly)方法來(lái)打開(kāi)一個(gè)文件。其中/dev/input/event表示需要打開(kāi)的設(shè)備文件名,o_rdonly表示的是打開(kāi)方式,本實(shí)施例中是通過(guò)只讀方式打開(kāi)設(shè)備文件。open函數(shù)將返回一個(gè)設(shè)備文件描述符,使用key_fd來(lái)接收該設(shè)備文件描述符。

如果key_fd大于0表示文件打開(kāi)成功,如果key_fd小于0表示文件打開(kāi)失敗。如果文件打開(kāi)失敗則需要結(jié)束讀取并且通過(guò)將錯(cuò)誤信息打印出來(lái),具體是printf("open/dev/input/eventdeviceerror!\n")方式來(lái)打印錯(cuò)誤信息。如果文件打開(kāi)成功,接下來(lái)就需要讀取文件中的信息了。

文件讀取是通過(guò)輪詢(xún)方式實(shí)現(xiàn),使用while(true)方式來(lái)實(shí)現(xiàn)無(wú)線循環(huán),在無(wú)線循環(huán)中不斷讀取/dev/input/event設(shè)備節(jié)點(diǎn)的內(nèi)容。具體讀取/dev/input/event內(nèi)容的方式是read(key_fd,&t,sizeof(t)),這個(gè)函數(shù)的內(nèi)容是將key_fd文件中的內(nèi)容讀取到t這個(gè)變量中,該變量可設(shè)置為全局變量。如果文件讀取成功read(key_fd,&t,sizeof(t))將返回大于等于0的值,如果讀取失敗read(key_fd,&t,sizeof(t))將返回小于0的值。

如果讀取失敗了,就需要以printf("read/dev/input/eventdeviceerror!\n")方式來(lái)打印錯(cuò)誤信息。

如果讀取成功了就需要將變量t中的內(nèi)容取出來(lái)判斷t中的內(nèi)容是多少。如果t的值是0就表示按鍵被按下,如果t的值是1就表示按鍵被抬起。

每次完成一次讀取周期后,需要調(diào)用一個(gè)延時(shí)函數(shù)sleep同時(shí)將傳遞進(jìn)來(lái)的檢測(cè)周期delt_time傳遞到sleep函數(shù)中,也就是調(diào)用sleep(delt_time)函數(shù)來(lái)實(shí)現(xiàn)延時(shí),延時(shí)后在進(jìn)入下一次的調(diào)用周期。這樣的好處是能夠保證用戶(hù)檢測(cè)精度的情況下盡量節(jié)省系統(tǒng)的開(kāi)銷(xiāo)。

當(dāng)檢測(cè)到按鍵被按下后就將被按下的事件通過(guò)函數(shù)指針的形式上報(bào)。

優(yōu)勢(shì)分析:

a)輪詢(xún)檢測(cè)中,對(duì)設(shè)備打開(kāi)和讀取做了校驗(yàn)判斷,如果打開(kāi)成功才能讀取,打開(kāi)失敗會(huì)打印提示信息告知調(diào)用者。

b)檢測(cè)按鍵事件精度可調(diào),我們可以通過(guò)delt_time這個(gè)參數(shù)來(lái)設(shè)置輪詢(xún)頻率,這樣確保調(diào)用者在達(dá)到精度需求的同時(shí)也能夠達(dá)到節(jié)省系統(tǒng)資源的目的。

c)檢測(cè)到按鍵事件后通過(guò)函數(shù)指針((void*))key_fun(intfun_type)進(jìn)行上報(bào),監(jiān)聽(tīng)者能夠及時(shí)的獲取到按鍵變化情況。

3、檢測(cè)到按鍵的數(shù)據(jù)回調(diào)邏輯

當(dāng)通過(guò)步驟2中檢測(cè)到按鍵被按下的時(shí)候,就會(huì)通過(guò)回調(diào)函數(shù)(void*)key_fun(intfun_type)將按鍵事件上報(bào)出去。具體實(shí)現(xiàn)是如果通過(guò)read(key_fd,&t,sizeof(t))函數(shù)讀取到的t的值是大于等于0的表明是有按鍵被按下了,此時(shí)需要調(diào)用函數(shù)指針key_fun(key_down)來(lái)將按鍵事件上報(bào)出去,其中key_down表示的是一個(gè)自定義的常量,該常量的值是1。

之所以有一個(gè)fun_type類(lèi)型回調(diào)出去是為了方便后期兼容其他按鍵事件做好預(yù)留工作,提高了該函數(shù)的擴(kuò)展性。

通過(guò)上述的函數(shù)指針的調(diào)用方法我們就將按鍵的觸發(fā)事件告知給外部了,這樣外部就能夠?qū)崟r(shí)的獲取到按鍵被按下的信息了。

優(yōu)勢(shì)分析:函數(shù)指針(void*)key_fun(intfun_type)中設(shè)計(jì)了一個(gè)類(lèi)型變量,這樣我能就能夠?qū)⒏鞣N各樣的按鍵事件上報(bào)出去了。這種設(shè)計(jì)大大提高了該函數(shù)的擴(kuò)展性,對(duì)于后期其他按鍵事件的擴(kuò)展起到了非常好的兼容作用。

為了實(shí)現(xiàn)上述實(shí)施例,本發(fā)明還提供了基于linux內(nèi)核層的按鍵監(jiān)聽(tīng)系統(tǒng),如圖3所示,蓋系統(tǒng)包括:

監(jiān)聽(tīng)文件設(shè)置模塊,用于將指定按鍵通過(guò)linux內(nèi)核虛擬化為設(shè)備節(jié)點(diǎn),該設(shè)備節(jié)點(diǎn)表現(xiàn)為按鍵監(jiān)聽(tīng)文件,該按鍵監(jiān)聽(tīng)文件包括一個(gè)用于監(jiān)聽(tīng)該指定按鍵的自定義函數(shù),該自定義函數(shù)中設(shè)置了檢測(cè)按鍵的輪詢(xún)周期以及上報(bào)按鍵狀態(tài)的事件函數(shù);按鍵監(jiān)聽(tīng)文件可預(yù)存在linux系統(tǒng)的設(shè)備文件中。

讀取模塊,用于通過(guò)操作系統(tǒng)根據(jù)設(shè)置的輪詢(xún)周期以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件,并將該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取到預(yù)設(shè)變量中;

監(jiān)聽(tīng)模塊,用于在讀取模塊讀取成功時(shí),判斷該預(yù)設(shè)變量中的內(nèi)容是否為預(yù)設(shè)值,該預(yù)設(shè)值對(duì)應(yīng)指定按鍵被按下或者抬起的狀態(tài)值,若是,則根據(jù)事件函數(shù)將按鍵狀態(tài)上報(bào)。

本發(fā)明的一個(gè)實(shí)施例中,若該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取成功,則返回大于等于0的值,若讀取失敗則返回小于0的值。進(jìn)一步地,該監(jiān)聽(tīng)模塊具體可通過(guò)函數(shù)指針的形式將按鍵狀態(tài)上報(bào)。

如圖4所示,該系統(tǒng)還包括延時(shí)模塊,用于在操作系統(tǒng)以輪詢(xún)方式讀取該按鍵監(jiān)聽(tīng)文件時(shí),每完成一次輪詢(xún)周期,則將檢測(cè)按鍵的輪詢(xún)周期傳遞給一延時(shí)函數(shù)來(lái)實(shí)現(xiàn)延時(shí),延時(shí)結(jié)束后再進(jìn)入下一次的輪詢(xún)周期。

如圖5所示,該系統(tǒng)還可包括打印模塊,用于在該按鍵監(jiān)聽(tīng)文件中的內(nèi)容讀取失敗時(shí),調(diào)用預(yù)設(shè)的打印函數(shù)打印錯(cuò)誤信息。

綜上,本發(fā)明通過(guò)將按鍵在linux內(nèi)核層中虛擬成一個(gè)設(shè)備節(jié)點(diǎn),操作系統(tǒng)通過(guò)輪詢(xún)的方式讀取該設(shè)備節(jié)點(diǎn)文件的值來(lái)判定按鍵是否被按下或者抬起,本發(fā)明能夠有效的檢測(cè)系統(tǒng)中物理按鍵的按下或者抬起情況。

應(yīng)當(dāng)理解的是,對(duì)本領(lǐng)域普通技術(shù)人員來(lái)說(shuō),可以根據(jù)上述說(shuō)明加以改進(jìn)或變換,而所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1