Linux select 函式注意要點

2021-06-06 02:32:44 字數 2037 閱讀 9237

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set*exceptfds, struct timeval *timeout);

voidfd_clr(int fd, fd_set *set);

int fd_isset(int fd, fd_set *set);

voidfd_set(int fd, fd_set *set);

voidfd_zero(fd_set *set);

1.select 函式是阻塞的,具體測試方法如下:

執行下面程式

#./client192.168.60.123

#ps -e -o fname,wchan | grep client

client_spoll_schedule_timeout

程序阻塞在 select函式

2.三個引數readfds,writefds,exceptfds即作為輸入引數,有作為輸出引數。

這樣引數需要特別注意,當每次呼叫該函式,需要重新清零,並且重新初始化。下面**說明:

while(1)

3.如果要構造更加精確超時機制,可以修改mysleep函式,達到毫秒級別。

intmysleep(unsigned int seconds)

4.理解可讀,可寫,異常描述符生效條件。

#############################################client.c

#include

#include

#include

#include

#include

#include

#include

#include

#define maxsize 256

#define fname "test"

void   sigpipe_info(int signo)

void setup_signal(void)

int mysleep(unsigned int seconds)

int main(int argc, char*argv)

setup_signal();

if((sockfd = socket(af_inet, sock_stream, 0)) < 0)

bzero(&servadd,sizeof(servadd));

servadd.sin_family = af_inet;

servadd.sin_port = htons(9999);

servadd.sin_addr.s_addr=inet_addr(argv[1]);

if(connect(sockfd, (struct sockaddr *)&servadd, sizeof(servadd)) < 0)

while (1)

if (fd_isset(0,&rfds))

if((ret = write(sockfd,buf,strlen(buf))) < 0 )

printf("input:%s",buf);

}if(fd_isset(sockfd,&rfds))

if (ret == 0) // socket eof

else}}

return -1;

}###################################server.c

#include

#include

#include

#include

#include

#include

#include

#define maxsize 256

void reap_child( int signo)

return ;

}int main()

}close(connfd);

return 0;

default:

close(connfd);

break;}}

return 0;

}

linux select函式用法

select系統呼叫是用來讓我們的程式監視多個檔案控制代碼的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。關於檔案控制代碼,其實就是乙個整數,我們最熟悉的控制代碼是0 1 2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0 1 2是整數表示的,...

linux select函式用法

select系統呼叫是用來讓我們的程式 監視多個檔案控制代碼的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。關於檔案控制代碼,其實就是乙個整數,我們最熟悉的控制代碼是0 1 2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0 1 2是整數表示的...

Linux select函式詳解

我們所關心的檔案描述符 對每個描述符,我們所關心的狀態。我們是要從乙個檔案描述符中讀或者寫,還是關注乙個描述符中是否出現異常 我們要等待多長時間。我們可以等待無限長的時間,等待固定的一段時間,或者根本就不等待 有了這些返回資訊,我們可以呼叫合適的i o函式 通常是read或 write 並且這些函式...