5 回答

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

TA貢獻1799條經驗 獲得超9個贊
一、如果一個發現I/O有輸入,讀取的過程中,另外一個也有了輸入,這時候不會產生任何反應.這就需要你的程序語句去用到select函數的時候才知道有數據輸入。
二、程序去select的時候,如果沒有數據輸入,程序會一直等待,直到有數據為止,也就是程序中無需循環和sleep。
Select在Socket編程中還是比較重要的,可是對于初學Socket的人來說都不太愛用Select寫程序,他們只是習慣寫諸如connect、accept、recv或recvfrom這樣的阻塞程序(所謂阻塞方式block,顧名思義,就是進程或是線程執行到這些函數時必須等待某個事件的發生,如果事件沒有發生,進程或線程就被阻塞,函數不能立即返回)。
可是使用Select就可以完成非阻塞(所謂非阻塞方式non-block,就是進程或線程執行此函數時不必非要等待事件的發生,一旦執行肯定返回,以返回值的不同來反映函數的執行情況,如果事件發生則與阻塞方式相同,若事件沒有發生,則返回一個代碼來告知事件未發生,而進程或線程繼續執行,所以效率較高)方式工作的程序,它能夠監視我們需要監視的文件描述符的變化情況——讀寫或是異常。
返回值:準備就緒的描述符數,若超時則返回0,若出錯則返回-1。

TA貢獻1811條經驗 獲得超4個贊
阻塞式I/O編程有兩個特點:
一、如果一個發現I\O有輸入,讀取的過程中,另外一個也有了輸入,這時候不會產生任何反應,也就是需要你的程序語句去select的時候才知道有數據輸入。
二、程序去select的時候,如果沒有數據輸入,程序會一直等待,直到有數據位置,也就是程序中無需循環和sleep。
添加回答
舉報