问题出现的情景
轮询一个tcp服务,client使用阻塞模式,只要收到server的回复就进入下一轮请求;但是结果是我并没有得到我想要的内容;
以下为strace server程序的分析
_newselect方法(或者叫函数..)是linux中网络通信中高频出现的一个系统调用;emmm不过我并没有找到_newselect方法的文档,不过找到了select方法的;同时,select方法和另一个叫做pselect的方法比较;
select 和 pselect 允许同时监听多个文件描述符,这两个方法可以保持阻塞,直到当有一个或者多个文件描述符进入了某类io操作的”ready”状态
select与pselect的区别
- select定义超时使用struct timeval(精确到ms),pselect则使用struct timespec(精确到us)
- select可以更改超时时间参数,以指明过去了多长时间;而pselect则不可以
- select没有sigmask参数,pselect拥有sigmask,select的动作与pselect 设置null sigmask的动作相似;
=====================================================================
根据我目前对linux网络通信的理解,_newselect方法是可以替代socket系统调用的;
这个方法是posix标准下的一个系统调用:属于一个同步IO方法
select的参数
_newselect方法拥有5个参数
- int nfds
- fd_set *readfds 该参数是一个列表,决定监听哪些文件,这个列表里的文间讲时刻被监控是否处于可读状态
- fd_set *writefds 同样,writefds也是一个列表,决定监听这些文件,在被写的时候是否不会被阻塞
- fd_set *exceptfds
- struct timeval *timeout 超时时间设置;这个参数是一个结构体,包含两个具体参数,可以设置秒数和毫秒数;
使用select意味着什么?
首先我们都知道,在进行tcp等依赖于socket的通信的时候,socket本身是一个文件描述符,因此,select是完全可以用来监控多个socket的;使用select做一个阻塞,将多个socket(文件描述符)塞到select里面,这个select将会在其中某一个socket可以被操作的时候结束阻塞,继续向下进行;
这种结构很适合进行一些接受&处理分离的东西,由select来确定多个socket中是否有一个被使用了,如果有一个那就把处理任务分发下去;
