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

unix中的select函数源码是什么样的


BIG阳
浏览 685回答 5
5回答

UYOU

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;}}}}

扬帆大鱼

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

波斯汪

阻塞式I/O编程有两个特点:一、如果一个发现I\O有输入,读取的过程中,另外一个也有了输入,这时候不会产生任何反应,也就是需要你的程序语句去select的时候才知道有数据输入。二、程序去select的时候,如果没有数据输入,程序会一直等待,直到有数据位置,也就是程序中无需循环和sleep。
打开App,查看更多内容
随时随地看视频慕课网APP