|
发表于 2009-11-6 17:38:52
|
显示全部楼层
Post by xuyaosong;2042437
fd_set rfds; ???这个到底是什么东西?有什么用呢?
int tttt=1;
while (tttt) //(TRUE)
{
printf("wait...\n");
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
if (select(1+fd, &rfds, NULL, NULL, &tv)>0) //在这里应该实现了判断是否有数据传来,但是具体如何实现的呢?
{
//printf("wait...\n");
if (FD_ISSET(fd, &rfds))
{
nread=read(fd, buff, BUFSIZE);
printf("readlength=%d\n", nread);
buff[nread]='\0';
printf("%s\n", buff);
}
}
sleep(1);
tttt=0;
}
上面是一个网上找到的程序,我现在就比较纳闷的是它如何实现等待的呢?里面的那个FD——SET、FD——ZERO、FD——ISSET都是干啥的啊,怎么用呢?请高手给解答一下。多谢
man select !
select是用同步信号量实现的,在select的实现里会用semGet住一个信号量,当相应的fd上有数据过来时,相应程序必须semGive这个信号量,这样程序就会往下走,相应的read就立马读到数据了。
这样做是因为read本身是一个死等的实现,如果没有数据的话,read会一直耗在等数据的操作上直到有数据到来为止。这样就白白消耗了cpu。而select可以让没有数据的时候让度出cpu,交给有需要的任务进程去干事情,这样就提高了系统的效率。
而那个FD_SET只是一个监视注册器,比如说你往我这个监视器里注册了串口,套接口1,套接口2,那么串口,套接口1、套接口2的数据就会在我这个select中监测,你套接口3没注册,我select就不管!
不知道说清楚了没有! |
|