select 函式 的學習

2022-08-12 04:45:13 字數 1693 閱讀 2385

select()的介紹 全是拷貝的如下文章:

select()函式的用例**摘錄如下文章:

1. select函式簡介

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

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

下面是select的函式原型:

/*

according to posix.1-2001

*/#include

select.h>

intselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

引數介紹:

第乙個引數:int nfds--->是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1

第二個引數:fd_set *readfds---->用來檢查一組可讀性的檔案描述符。

第三個引數:fd_set *writefds---->用來檢查一組可寫性的檔案描述符。

第四個引數:fd_set *exceptfds---->用來檢查檔案檔案描述符是否異常

第五個引數:sreuct timeval *timeout--->是乙個時間結構體,用來設定超時時間。該引數是null,表示是阻塞操作

select函式的返回值 :

負值:select錯誤

正值:表示某些檔案可讀或可寫

0:等待超時,沒有可讀寫或錯誤的檔案

下面是一些跟select() 一起使用的函式及結構的作用

void fd_zero(fd_set *set);         //

清空乙個檔案描述符的集合

void fd_set(int fd, fd_set *set); //

將乙個檔案描述符新增到乙個指定的檔案描述符集合中

void fd_clr(int fd, fd_set *set); //

將乙個指定的檔案描述符從集合中清除;

int fd_isset(int fd, fd_set *set);//

檢查集合中指定的檔案描述符是否可以讀寫

struct timeval 結構體可以精確到秒跟毫秒。用於設定阻塞時間;如果其成員設定為0,表示不阻塞,立即返回。

struct

timeval ;

下面是使用select()函式的乙個例子:

//

test select()

#include#include

#include

#include

#include

select.h>#include

#include

#include

intmain()

else

if(0 ==ret)

if(fd_isset(fd, &fd_set))

}close(fd);

return0;

}

學習筆記 select函式

select原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout select函式可以使用各種套接字巨集來控制io。fd clr int fd,fd set set ...

linux c學習筆記 select函式詳解

select系統呼叫是用來讓我們的程式監視多個檔案控制代碼 file descriptor 的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有某乙個或多個發生了狀態改變。何為檔案控制代碼?檔案控制代碼在linux裡很多,如果你man某個函式,在函式返回值部分說到成功後有乙個檔案...

linux socket的select函式例子

使用select函式可以以非阻塞的方式和多個socket通訊。程式只是演示select函式的使用,功能非常簡單,即使某個連線關閉以後也不會修改當前連線數,連線數達到最大值後會終止程式。1.程式使用了乙個陣列fd a,通訊開始後把需要通訊的多個socket描述符都放入此陣列。2.首先生成乙個叫sock...