日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Android系统--输入系统(一)必备的Linux知识_inotify和epoll

發(fā)布時間:2025/4/14 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统--输入系统(一)必备的Linux知识_inotify和epoll 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android系統(tǒng)--輸入系統(tǒng)(一)必備的Linux知識_inotify和epoll

引入

1. 筆記本電腦插入外接鍵盤,兩個鍵盤都可以使用

a. 鍵盤即插即用--如何檢測鍵盤的接入和拔出

  • hotplug機制:內(nèi)核發(fā)現(xiàn)鍵盤接入或撥出之后啟動hotplug進程,進程發(fā)出信號告訴輸入系統(tǒng),輸入系統(tǒng)處理

  • inotify機制:輸入系統(tǒng)使用inotify檢測/dev/input的節(jié)點變化

b. 可用使用多鍵盤--如何知道哪個鍵盤被按下

  • epoll機制:可以檢測多個事件

c. 如何使用inotify和epoll機制:

(1) inotify使用(用于檢測目錄或者文件的變化)

  • 初始化得到文件句柄--fd=inotify_init();

  • 檢測對象--inotify_add_watch(fd,目錄/文件,創(chuàng)建/刪除);

  • 對象變化--read();返回一個或者多個結(jié)構(gòu)體:struct inotify_event

struct inotify_event {__s32 wd;__u32 mask; //發(fā)生的變化狀態(tài)__u32 cookie;__u32 len; //name的長度char name[0]; //發(fā)生變化的文件}
范例代碼:

inotify.c

*Author : LKQ*Date : 2017-2-23*Desc : use inotify watch dir change*參考: frameworks\native\services\inputflinger\EventHub.cpp*//*Usage: inotify <dir> */#include <unistd.h>#include <stdio.h>#include <sys/inotify.h>#include <string.h>#include <errno.h>int read_process_inotify_fd(int fd){int res;char event_buf[512];int event_size;int event_pos = 0;struct inotify_event *event;/* read */ res = read(fd, event_buf, sizeof(event_buf)); //return a struct if(res < (int)sizeof(*event)) {if(errno == EINTR)return 0;printf("could not get event, %s\n", strerror(errno));return -1;} //procee : read a and more inotify_event//deal with each struct while(res >= (int)sizeof(*event)) {event = (struct inotify_event *)(event_buf + event_pos);//printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");if(event->len) {if(event->mask & IN_CREATE) {printf("create file: %s\n", event->name);} else {printf("delete file: %s\n", event->name);}}event_size = sizeof(*event) + event->len;res -= event_size;event_pos += event_size;}return 0;}int main(int argc,char **argv){int mINotifyFd;int result;if(argc != 2){printf("Usage : %s <dir> \n",argv[1]);}/*1. inotify init*/mINotifyFd = inotify_init(); /*2. add watch*/result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE); /*3. read*/while (1){read_process_inotify_fd(mINotifyFd);}return 0;}
使用過程:

gcc -o inotify inotify.c

mkdir tmp

./inotify tmp &

echo > tmp/1

echo > tmp/2

rm tmp/1 tmp/2

(2) epoll使用(用于檢測多個文件:1. 有無數(shù)據(jù)可供讀取;2. 有無空間寫入)

  • 初始化得到文件句柄--fd=epoll_create();

  • 對于每一個文件執(zhí)行epoll_ctl(fd,EPOLL_CRTL_ADD,...);表示監(jiān)測該文件的行為

  • epoll_wait();等待某個文件可用epoll_ctl(fd,EPOLL_CRTL_DEL,...);

范例代碼:

epoll.c

/**Author : LKQ*Date : 2017-2-23*Desc :how to use epoll*參考: frameworks\native\services\inputflinger\EventHub.cpp*//* usage: epoll <file1> [file2] [file3] ... */#include <stdio.h>#include <sys/epoll.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#if 0typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64;} epoll_data_t;#endif#define DATA_MAX_LEN 512int add_to_epoll(int fd, int epollFd){int result;struct epoll_event eventItem;memset(&eventItem, 0, sizeof(eventItem));eventItem.events = EPOLLIN;eventItem.data.fd = fd;result = epoll_ctl(epollFd, EPOLL_CTL_ADD, fd, &eventItem);return result;}void rm_from_epoll(int fd, int epollFd){epoll_ctl(epollFd, EPOLL_CTL_DEL, fd, NULL);}int main(int argc,char **argv){int mEpollFd;int i;char buf[DATA_MAX_LEN];// Maximum number of signalled FDs to handle at a time.static const int EPOLL_MAX_EVENTS = 16;// The array of pending epoll events and the index of the next event to be handled.struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS];if (argc < 2){printf("Usage: %s <file1> [file2] [file3] ...\n", argv[0]);return -1;}/*1. epoll create*/mEpollFd = epoll_create(8); /*2. for each file:* open it* add it to epoll: epoll_ctl(...EPOLL_CTL_ADD...)*/for(i=1;i<argc;i++){//int tmpFd = open(argv[i], O_RDONLY|O_NONBLOCK);int tmpFd = open(argv[i],O_RDWR);add_to_epoll(tmpFd,mEpollFd);}/*3. epoll_wait */while (1){int pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, -1);for (i = 0; i < pollResult; i++){printf("Reason: 0x%x\n", mPendingEventItems[i].events);int len = read(mPendingEventItems[i].data.fd, buf, DATA_MAX_LEN);buf[len] = '\0';printf("get data: %s\n", buf);}}/*remove epoll*/for(i=1;i<argc;i++){rm_from_epoll(mPendingEventItems[i].data.fd,mEpollFd);}return 0;}
操作方法:

gcc -o epoll epoll.c

mkdir tmp

mkfifo tmp/1 tmp/2 tmp/3

./epoll tmp/1 tmp/2 tmp/3 &

echo aaa > tmp/1

echo bbb > tmp/2

echo ccc > tmp/3

補充:

當fifo文件以 O_RDONLY|O_NONBLOCK 方式打開,會出現(xiàn)不斷返回epoll_wait,導(dǎo)致崩潰。

原因:使用fifo是, 我們的epoll程序是reader;echo aa > tmp/1 是writer

a. 如果reader以 O_RDONLY|O_NONBLOCK打開FIFO文件,writer寫入數(shù)據(jù)時, epoll_wait會立刻返回;
當writer關(guān)閉FIFO之后, reader再次調(diào)用epoll_wait, 它也會立刻返回(原因是EPPLLHUP, 描述符被掛斷)

b. 如果reader以 O_RDWR打開FIFO文件當writer寫入數(shù)據(jù)時, epoll_wait會立刻返回;
當writer關(guān)閉FIFO之后, reader再次調(diào)用epoll_wait, 它并不會立刻返回, 而是繼續(xù)等待有數(shù)據(jù)

轉(zhuǎn)載于:https://www.cnblogs.com/lkq1220/p/6434184.html

總結(jié)

以上是生活随笔為你收集整理的Android系统--输入系统(一)必备的Linux知识_inotify和epoll的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲 美腿 欧美 偷拍 | 亚洲女人初尝黑人巨大 | 变态另类丨国产精品 | 韩国美女视频在线观看18 | 九一av | 亚洲欧美精品在线观看 | 久久午夜国产 | 隣の若妻さん波多野结衣 | 中文字幕网站在线观看 | 久久久久久久久久久国产精品 | 国产一级内谢 | 国产影视一区二区三区 | 国内精品第一页 | 一区av在线 | 黑巨茎大战欧美白妞 | 日本视频网 | 麻豆区1免费 | 双性尿奴穿贞c带憋尿 | 成年人av在线播放 | 天天看天天色 | 午夜激情影视 | 欧美视频一区二区 | 亚洲人色| 在线精品亚洲欧美日韩国产 | 伊人成人在线观看 | 成人黄色在线看 | 日韩一区二区三区久久 | 国产同性人妖ts口直男 | 欧美mv日韩mv国产 | 在线日本中文字幕 | 国产成人久久77777精品 | 久久久av免费| 三上悠亚ed2k | 中文人妻熟妇乱又伦精品 | 日韩电影一区二区 | 亚洲精品男人天堂 | 成人av男人的天堂 | 国产成人精品亚洲 | www四虎影院 | 久久久久久久极品 | 黄色a∨ | 骚狐网站| 五月激情丁香 | 搞黄网站在线观看 | 国产67194 | 一级女性全黄久久生活片免费 | 中文字幕校园春色 | 91插插视频 | 美女扒开尿口给男人看 | 中国丰满人妻videoshd | 性开放的欧美大片 | 青青草视频在线看 | 偷偷在线观看免费高清av | 韩国视频一区二区三区 | 91深夜福利 | 97国产精东麻豆人妻电影 | 午夜精品成人毛片非洲 | 色综合久久精品亚洲国产 | 一本色道久久综合亚洲精品酒店 | 色性网站| 91久久久久久久久久久久 | 538在线精品视频 | 黄色网址www | 日韩乱码人妻无码系列中文字幕 | 一区二区欧美精品 | 香蕉视频色 | 美国成人免费视频 | 999视频在线| 午夜草逼 | 91久久中文字幕 | 精品国产一区二区三区久久狼黑人 | 久久精品人妻一区二区三区 | 欧美精品99| av在线播放一区二区三区 | 国产欧美亚洲一区 | 尤物网址在线观看 | 深夜在线 | 成人av在线资源 | 欧美野外猛男的大粗鳮 | 欧美日韩国产电影 | 一区二区三区国产视频 | 日韩免费黄色片 | 日韩在线观看视频网站 | 精品中文字幕一区二区 | 邵氏电影《金莲外传2》免费观看 | 成人深夜视频 | 一本色道久久88加勒比—综合 | 久久成人国产精品 | 91美女网站 | 欧美三级一级片 | 色一区二区 | 岛国精品一区二区三区 | 黄色片在线视频 | 天天射网 | 日日夜夜爱爱 | 老司机黄色片 | 午夜视频在线观看免费视频 | 人人爱人人搞 | 中国老熟女重囗味hdxx |