你的位置:首页 > 操作系统

[操作系统]5.2使用select,poll

 

5.2 使用select,poll   // CPU占用率低,适用于很多简单场合

参考:UNIX环境高级编程 I/O多路转接

监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回
int select(int nfds,    fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
                最大文件句柄+1   被监测是否可读的文件                                         超时时间
                                               被监测是否可写的文件
                                                                被监测是否有异常的文件
   

修改

int AllInputDevicesInit(void){  PT_InputOpr ptTmp = g_ptInputOprHead;  int iError = -1;  FD_ZERO(&g_tRFds);  while (ptTmp)  {    if (0 == ptTmp->DeviceInit())    {      FD_SET(ptTmp->iFd, &g_tRFds);      if (g_iMaxFd < ptTmp->iFd)        g_iMaxFd = ptTmp->iFd;      iError = 0;    }    ptTmp = ptTmp->ptNext;  }  g_iMaxFd++;  return iError;}int GetInputEvent(PT_InputEvent ptInputEvent){  /* ÓÃselectº¯Êý¼à²âstdin,touchscreen     ÓÐÊý¾ÝʱÔÚÎÒµ÷ÓÃÏàÓ¦µÄGetInputEventº¯Êý»ò»ñµÃ¾ßÌåʱ¼ä  */  PT_InputOpr ptTmp = g_ptInputOprHead;  fd_set tRFds;  int iRet;  tRFds = g_tRFds;  iRet = select(g_iMaxFd, &tRFds, NULL, NULL, NULL);  if (iRet > 0)  {    while (ptTmp)    {      if (FD_ISSET(ptTmp->iFd, &tRFds))      {        if(0 == ptTmp->GetInputEvent(ptInputEvent))        {          return 0;        }      }      ptTmp = ptTmp->ptNext;    }  }  return -1;}