为了账号安全,请及时绑定邮箱和手机立即绑定

请问在unix中的select函数源码是什么样的?

请问在unix中的select函数源码是什么样的?

BIG阳 2019-07-09 10:06:28
unix中的select函数源码是什么样的
查看完整描述

5 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

FD_ZERO(&readSet);
FD_SET(fd, &readSet);
printf("%d\n",fd);
int iRet = select(fd + 1, &readSet, NULL, NULL, &timeout);
if(iRet == -1)
{
printf("/*SerialPort recv_data select error! */\n");
return -1;
}
else if(iRet == 0)
{
printf("/*SerialPort recv_data select time out! */\n");
return -1;
}
else
{ //等待接收
if(FD_ISSET(fd, &readSet))
{
tmp_len=read(fd, tmp_buf, 1024);
if(tmp_len < 0)
{
printf("/*SerialPort recv_data error! */\n");
return -1;
}
else
{
memcpy(bOutBuf+iOutBufLen, tmp_buf, tmp_len);
iOutBufLen += tmp_len;
memset(tmp_buf,0,1024);
iLen = 105;
if(iOutBufLen ==iLen)
{
//printf("/*SerialPort recv_data sucess:*/\n");
//ShowByte(bOutBuf,iOutBufLen);
return 0;
}
}
}
}



查看完整回答
反对 回复 2019-07-14
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

一、如果一个发现I/O有输入,读取的过程中,另外一个也有了输入,这时候不会产生任何反应.这就需要你的程序语句去用到select函数的时候才知道有数据输入。
二、程序去select的时候,如果没有数据输入,程序会一直等待,直到有数据为止,也就是程序中无需循环和sleep。
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。
可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生,则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。
返回值:准备就绪的描述符数,若超时则返回0,若出错则返回-1。

查看完整回答
反对 回复 2019-07-14
?
波斯汪

TA贡献1811条经验 获得超4个赞

阻塞式I/O编程有两个特点:

一、如果一个发现I\O有输入,读取的过程中,另外一个也有了输入,这时候不会产生任何反应,也就是需要你的程序语句去select的时候才知道有数据输入。

二、程序去select的时候,如果没有数据输入,程序会一直等待,直到有数据位置,也就是程序中无需循环和sleep。

查看完整回答
反对 回复 2019-07-14
  • 5 回答
  • 0 关注
  • 679 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信