5 回答

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

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
阻塞式I/O編程有兩個(gè)特點(diǎn):
一、如果一個(gè)發(fā)現(xiàn)I\O有輸入,讀取的過(guò)程中,另外一個(gè)也有了輸入,這時(shí)候不會(huì)產(chǎn)生任何反應(yīng),也就是需要你的程序語(yǔ)句去select的時(shí)候才知道有數(shù)據(jù)輸入。
二、程序去select的時(shí)候,如果沒(méi)有數(shù)據(jù)輸入,程序會(huì)一直等待,直到有數(shù)據(jù)位置,也就是程序中無(wú)需循環(huán)和sleep。
添加回答
舉報(bào)