- poll机制
- select函数和poll函数的内部机制是一样的,详细参考:第二期驱动大全poll机制
- select函数可以监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回
- readfds 被监测是否可读的文件
- writefds 被监测是否可写的文件
- exceptfds 被监测是否有异常的文件
- timeout 超时时间(指定要监测多久)
- nfds 最大文件句柄+1
/* 修改输入操作类 */
typedef struct InputOpr{
char *name;
int iFd; /* 添加文件描述符成员 */
int (*DeviceInit)(void);
int (*DeviceExit)(void);
int (*GetInputEvent)(PT_InputEvent ptInputEvent); /* 获取输入事件 */
struct InputOpr *ptNext;
}T_InputOpr, *PT_InputOpr;
- 在xxxDevInit函数中初始化iFd成员
修改GetInputEvent()函数,通过select函数来监测stdin、touchscreen,有数据之后再调用stdin、touchscreen里相应的GetInputEvent()函数 ```c static fd_set g_tRfds; static int g_iMaxFd = -1; int AllInputDevicesInit(void) { //…. FD_ZERO(&g_tRfds); if(0 == pTemp->DeviceInit())
FD_SER(pTemp->iFd, &g_tRfds); /* 设置想要监测的文件 */
if(g_iMaxFd < pTemp->iFd)
g_iMaxFd = pTemp->iFd;
g_iMaxFd++; / 最大文件句柄+1 / //… }
int GetInputEvent(PT_InputEvent ptInputEvent) { /* use select function monitoring stdin/touchscreen,
* when have data, call they GetInputEvent function or get real event
*/
PT_InputOpr ptTemp = g_ptInputOprHead;
int iRet;
fd_set tFds;
tFds = g_tFds;
iRet = select(g_iMaxFd, &tFds, NULL, NULL, NULL); /* 只监测可读的文件,不理会可写、异常、超时 */
if(iRet > 0){
while(ptTemp)
{
if(FD_ISSET(ptTemp->iFd, &tFds)){ //tFds
if(0 == ptTemp->GetInputEvent(ptInputEvent))
return 0;
}
ptTemp = ptTemp->ptNext;
}
}
} ```
- UNIX环境高级编程 I/O多路转接
- ls /dev/event* 查看是否有touchscreen设备节点,没有需要insmod xxx_ts.ko加载驱动模块
- 使用select机制可以极大的减少CPU占用率,适用于很多简单的场合