《UNP》select函数
该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才会唤醒它。
#include
#include
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
//返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1;
struct timeval{
long tv_sec;
//秒数
long tv_usec;
//微秒数
};
timeout:告知内核等待所指定描述符中的任何一个就绪可花多长时间。
当timeout为NULL时,表示永远等待下去,仅在有一个描述符准备好I/O时才返回。
设置中间三个参数的例子
fd_set rset;
FD_ZERO(&rset);
FD_SET(1,&rset);
FD_SET(4,&rset);
操作fd_set的四个函数
void FD_ZERO(fd_set *fdset);
//全部置0
void FD_SET(int fd, fd_set *fdset);
//在fdset里,把fd置位
void FD_CLR(int fd, fd_set *fdset);
//把fd复位
int FD_ISSET(int fd, fd_set *fdset);
//判断fd是否设置
【《UNP》select函数】maxfdp1:指定待测试的描述符个数,它的值时待测试的最大描述符+1,因为描述符时从0开始数的。
例子
#include "unp.h"
int
main(int argc, char **argv)
{
int fd,n;
fd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
servaddr.sin_family=AF_INET;
if(argc!=3){
printf("USAGE: \n");
exit(0);
}
else{
servaddr.sin_port=atoi(argv[2]);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
}
connect(fd,(struct sockaddr*)&servaddr,sizeof(servaddr));
char wbuf[2000],rbuf[2000];
int maxfd;
fd_set rset;
FD_ZERO(&rset);
for(;
;
){
FD_SET(fileno(stdin),&rset);
FD_SET(fd,&rset);
maxfd=max(fd,fileno(stdin))+1;
select(maxfd,&rset,NULL,NULL,NULL);
if(FD_ISSET(fd,&rset)){
if(read(fd,rbuf,2000)==0)
break;
fputs(rbuf,stdout);
}
if(FD_ISSET(fileno(stdin),&rset)){
if(fgets(wbuf,2000,stdin)==0)
break;
write(fd,wbuf,2000);
}
}}
推荐阅读
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 《跨界歌手》:亲情永远比爱情更有泪点
- 诗歌:|诗歌: 《让我们举起世界杯,干了!》
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 人间词话的智慧
- 《一代诗人》37期,生活,江南j,拨动心潭的一泓秋水
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术
- 书评——《小行星》