(1). select方法
select(FD_SETSIZE, &rdfds, &wrfds, &epfds, &to);函数需要注意的地方
a. rdfds,wrfds,epfds 这些包含需要监视文件描述符的参数要使用临时的,值等于设置好的fd_set变量,因为select函数执行完会改变这个值,所以直接传的话就每次执行都要先使用FD_SET,FD_CLR这样的宏来设置.如下面代码中的"
testfds = m_stParam.rdfds;
",在这个代码的m_stParam.rdfds中监视了串口描述符,还有一个tcp或多个tcp和一个udp或多个udp描述符.用于串口控制程序,udp/tcp连接到地图服务器,更新和获取信息.
while(true)
{
testfds = m_stParam.rdfds;
if(m_stParam.timeout == 0){
rc = select(FD_SETSIZE, &testfds, NULL, NULL, NULL);
}else{
struct timeval to;
to.tv_sec = m_stParam.timeout / 1000;
to.tv_usec = m_stParam.timeout % 1000 * 1000;
rc = select(FD_SETSIZE, &testfds, NULL, NULL, &to);
}
if(rc == -1){
print_per("select() error : ");
;//select error
}
else if(rc == 0){
|
b. 当select正确返回,获取是那个或那几个文件描述符导致函数返回时为了节省时间,for循环查询时只需要从fd=3开始查,查到fd < maxfd + 1.因为0:stdin;1:stdout;2:stderr,这三个一般都不监测,maxfd值为fd_set中设置的文件描述符的最大值.
c. 同样select函数的第一个参数也可以传maxfd+1, 而不用传FD_SETSIZE从而节省时间
(2). poll
(3). epoll
(4).
阅读(290) | 评论(0) | 转发(0) |