C語言 select函式使用

2021-06-23 06:09:22 字數 1388 閱讀 7766



在程式設計的過程中,經常會遇到許多阻塞的函式,好像read和網路程式設計時使用的recv, recvfrom函式都是阻塞的函式,當函式不能成功執行的時候,程式就會一直阻塞在這裡,無法執行下面的**。這是就需要用到非阻塞的程式設計方式,使用selcet函式就可以實現非阻塞程式設計。

selcet函式是乙個輪循函式,即當迴圈詢問檔案節點,可設定超時時間,超時時間到了就跳過**繼續往下執行。

例子:

[html]view plain

copy

print

?fd_set readfd;  

struct timeval timeout;  

fd_zero(&readfd);   //初始化readfd  

fd_set(gps_fd, &readfd);   //把gps_fd加入readfd  

timeout.tv_sec = 3;   //設定3秒超時  

timeout.tv_usec = 0;  

j = select(gps_fd+1, &readfd, null, null, &timeout);   //用select對gps_fd進行輪循  

if( j>0 )  

}  

fd_set readfd;

struct timeval timeout;

fd_zero(&readfd); //初始化readfd

fd_set(gps_fd, &readfd); //把gps_fd加入readfd

timeout.tv_sec = 3; //設定3秒超時

timeout.tv_usec = 0;

j = select(gps_fd+1, &readfd, null, null, &timeout); //用select對gps_fd進行輪循

if( j>0 )

}

select函式有5個引數

第乙個是所有檔案節點的最大值加1,如果我有三個檔案節點1、4、6,那第乙個引數就為7(6+1)

第二個是可讀檔案節點集,型別為fd_set。通過fd_zero(&readfd);初始化節點集;然後通過fd_set(fd, &readfd);把需要監聽是否可讀的節點加入節點集

第三個是可寫檔案節點集中,型別為fd_set。操作方法和第二個引數一樣。

第四個引數是檢查節點錯誤集。

第五個引數是超時引數,型別為struct timeval,然後可以設定超時時間,分別可設定秒timeout.tv_sec和微秒timeout.tv_usec。

然後呼叫select函式,用fd_isset()函式判斷節點是否可讀寫。返回值不為0表示可讀寫,為0表示不可讀寫。select函式的返回值為是乙個整數,表示有幾個節點可讀寫。

細談select函式(C語言)

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

細談select函式(C語言)

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

細談select函式(C語言)

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...