【发布时间】:2011-11-29 13:31:24
【问题描述】:
应用需要能够对各种事件设置回调。事件可以是:
已达到 UTC 时间
数据已到达文件描述符
子进程已完成。
我需要编写一个函数来调度事件。该应用程序将在嵌入式平台上运行,并应采取合理的措施来最大限度地减少 CPU 使用率。
一种方法是繁忙的循环:
#define MAX_EVENT 10
typedef enum tagEventType {EV_DATA, EV_CHILD, EV_TIME} tEventType;
typedef void(*tEventCallback)(int);
typedef struct tagEvent
{
int sequence;
tEventType type;
tEventCallback callback;
time_t time;
int fd;
pid_t pid;
} tEvent;
static tEvent eventsTable[MAX_EVENT];
static void processEvents(void)
{
int i;
for ( i=0; i<MAX_EVENT; ++i )
{
if ( eventsTable[i].sequence > 0 )
{
switch(eventsTable[i].type)
{
case EV_DATA:
if ( checkForDataUsingPoll( eventsTable[i].fd) )
{
eventsTable[i].callback(eventsTable[i].sequence);
}
break;
case EV_CHILD:
if ( kill(eventsTable[i].pid, 0) == -1 )
{
eventsTable[i].callback(eventsTable[i].sequence);
eventsTable[i].sequence = 0;
}
break;
case EV_TIME:
{
if ( time(NULL) > eventsTable[i].time )
{
eventsTable[i].callback(eventsTable[i].sequence);
eventsTable[i].sequence = 0;
}
}
break;
}
}
}
}
int main( int argc, char* argv[] )
{
signal(SIGCHLD, SIG_IGN);
while(1)
{
processEvents();
usleep(1000);
}
return 0;
}
checkForDataUsingPoll() 使用超时为零的 poll() 来检查数据是否已到达文件描述符。为简洁起见,我省略了它。
有没有办法避免繁忙的循环?也许是民意调查、信号和警报的混合体?
【问题讨论】: