- 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)){ //tFdsif(0 == ptTemp->GetInputEvent(ptInputEvent))return 0;}ptTemp = ptTemp->ptNext;}}
} ```
- UNIX环境高级编程 I/O多路转接
- ls /dev/event* 查看是否有touchscreen设备节点,没有需要insmod xxx_ts.ko加载驱动模块
- 使用select机制可以极大的减少CPU占用率,适用于很多简单的场合

