C語言 select函數使用__函數

來源:互聯網
上載者:User

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


selcet函數是一個輪循函數,即當迴圈詢問檔案節點,可設定逾時時間,逾時時間到了就跳過代碼繼續往下執行。


例子:

fd_set readfd;struct timeval timeout;FD_ZERO(&readfd);   //初始化readfdFD_SET(gps_fd, &readfd);   //把gps_fd加入readfdtimeout.tv_sec = 3;   //設定3秒逾時timeout.tv_usec = 0;j = select(gps_fd+1, &readfd, NULL, NULL, &timeout);   //用select對gps_fd進行輪循if( j>0 ){    if( FD_ISSET(gps_fd, &readfd) ){   //如果gps_fd可讀        i = read(gps_fd, buf, SIZE);        buf[i] = '\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函數的傳回值為是一個整數,表示有幾個節點可讀寫。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.