1、select函數作為定時器使用
it_value.tv_sec = 0;
it_value.tv_usec = 100000;
select(1,NULL,NULL,NULL,&it_value);
上面的代碼並不是立即返回而是等待100ms,可以作為定時器使用,並且准確度比sleep高。
2、linux平台下select函數修改超時時間
select_timeout.tv_sec = 10;
select_timeout.tv_usec = 0;
for(;;)
{
if(select(fd+1, &rset, NULL, NULL, &select_timeout)<=0)
{
it_value.tv_sec = 0;
it_value.tv_usec = 100000;
select(1,NULL,NULL,NULL,&it_value);
上面的代碼並不是立即返回而是等待100ms,可以作為定時器使用,並且准確度比sleep高。
2、linux平台下select函數修改超時時間
select_timeout.tv_sec = 10;
select_timeout.tv_usec = 0;
for(;;)
{
if(select(fd+1, &rset, NULL, NULL, &select_timeout)<=0)
{
**************
}
}
我們原本希望在fd可讀的時候處理該數據;如果沒有數據睡眠等待10s中。但是
實際上由於select函數修改select_timeout的值,導致上面的代碼進入無限循環並且不能睡眠。
}
}
我們原本希望在fd可讀的時候處理該數據;如果沒有數據睡眠等待10s中。但是
實際上由於select函數修改select_timeout的值,導致上面的代碼進入無限循環並且不能睡眠。
3、select函數協助判斷網絡連接斷開
select(confd+1, &rset, NULL, NULL, &select_timeout);
假設confd是一個tcp的網絡fd並且加入到rset中。如果socket的對端關閉連接,
該select函數立即從睡眠中返回,這時候如果讀該socket返回值為0;我們可以判斷該socket斷開。
select(confd+1, &rset, NULL, NULL, &select_timeout);
假設confd是一個tcp的網絡fd並且加入到rset中。如果socket的對端關閉連接,
該select函數立即從睡眠中返回,這時候如果讀該socket返回值為0;我們可以判斷該socket斷開。
4、select函數判斷一個網絡socket是否可寫
select(confd+1, NULL, &wset, NULL, &select_timeout);
假設一個confd是一個tcp連接的網絡socket,並且在調用上面的代碼之前對端已經關閉了
該tcp連接,這時候select函數立即返回,但是返回值是0;如果在調用該函數時對端沒有
關閉並且該socket寫緩沖區為空,這時候該任務睡眠等待該confd可寫,如果等待的過程
中該對端關閉連接select並不會立即返回,而是一直睡眠直到超時。
該tcp連接,這時候select函數立即返回,但是返回值是0;如果在調用該函數時對端沒有
關閉並且該socket寫緩沖區為空,這時候該任務睡眠等待該confd可寫,如果等待的過程
中該對端關閉連接select並不會立即返回,而是一直睡眠直到超時。