linux select函数(谁能告诉我 linux下select函数到底是干什么用的 貌似我不用它也可以得到我想要的结果啊 )
本文目录
- 谁能告诉我 linux下select函数到底是干什么用的 貌似我不用它也可以得到我想要的结果啊
- Linux内核中select,poll和epoll的区别
- linux select 怎么理解
- Linux下select函数文件描述符状态的问题
- 关于Linux下一个小程序中select()函数的问题,这个程序中select到底执行了几次
- linux下的select函数是干嘛的
- 关于linux中select()函数的问题
- 关于linux select函数fgets函数
- linux 下 select 函数 延时的问题
谁能告诉我 linux下select函数到底是干什么用的 貌似我不用它也可以得到我想要的结果啊
select是用来设置超时时间的,其第一个参数本来是一个文件号,假如读取该文件长时间没有返回则超时跳出,而这部分代码将文件号设置为0,说明只是为了控制延时不过看你这部分代码,明显只是实现一个比较精确定时的sleep这段代码之所以这么做,是因为linux本身的sleep函数非常不准(windows也是一样),在线程较多,cpu任务较重的时候,sleep函数的精确度根本无法达到要求于是你这段代码使用select来代替sleep更为精准,其精准程度和内核相关,如果内核的滴答频率决定的,一般是100HZ也有1000hz的(因内核版本不同而不同),也就是说select做多可以精确到10ms,或者1ms,而sleep就做不到于是这段函数最重要的作用就是用高精确的select函数来代替低精确度的sleep函数,实现时间较为精准的延时。可查阅《Linux就该这么学》了解更多Linux介绍。
Linux内核中select,poll和epoll的区别
select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并 发的场景下,nginx越来越收到欢迎。1、select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但 是这样也会造成效率的降低。2、不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。pollfd结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。从上面看,select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。3、在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一 个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。参考连接:http://www.cnblogs.com/bigwangdi/p/3182958.htmlhttp://www.oschina.net/question/234345_40335
linux select 怎么理解
linux select函数详解在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状态。(我们是要想从一个文件描述符中读或者写,还是关注一个描述符中是否出现异常) •我们要等待多长时间。(我们可以等待无限长的时间,等待固定的一段时间,或者根本就不等待) 从 select函数返回后,内核告诉我们一下信息: •对我们的要求已经做好准备的描述符的个数 •对于三种条件哪些描述符已经做好准备.(读,写,异常) 有了这些返回信息,我们可以调用合适的I/O函数(通常是 read 或 write),并且这些函数不会再阻塞.#include 《sys/select.h》 int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout); 返回:做好准备的文件描述符的个数,超时为0,错误为 -1. 首先我们先看一下最后一个参数。它指明我们要等待的时间:struct timeval{ long tv_sec; /*秒 */ long tv_usec; /*微秒 */ } 有三种情况: timeout == NULL 等待无限长的时间。等待可以被一个信号中断。当有一个描述符做好准备或者是捕获到一个信号时函数会返回。如果捕获到一个信号, select函数将返回 -1,并将变量 erro设为 EINTR。 timeout-》tv_sec == 0 &&timeout-》tv_usec == 0不等待,直接返回。加入描述符集的描述符都会被测试,并且返回满足要求的描述符的个数。这种方法通过轮询,无阻塞地获得了多个文件描述符状态。 timeout-》tv_sec !=0 ||timeout-》tv_usec!= 0 等待指定的时间。当有描述符符合条件或者超过超时时间的话,函数返回。在超时时间即将用完但又没有描述符合条件的话,返回 0。对于第一种情况,等待也会被信号所中断。
Linux下select函数文件描述符状态的问题
当然是在有输入或者输出时文件描述符的读写状态改变咯,比如标准输入的文件描述符是0,如果用select来等待0号文件描述符,那么当在键盘上敲字符时开始,就是文件描述符的读写状态改变之时,这时select函数就会返回;对于套接字描述符来说也是这样,用select来等待一个服务器描述符,那么当有新的连接请求时(服务器描述符等待请求时是一个读描述符,当有新请求时实际上是有一个输入),服务器描述符的读写状态改变,select函数返回。顺便说一下,检查哪个文件描述符发生改变,可以用FD_ISSET宏来进行检测。
关于Linux下一个小程序中select()函数的问题,这个程序中select到底执行了几次
原因很简单。因为,你按下一个键之后,缓冲区里面有数据了,也就是说,stdin已经发生了一个事件,就是有数据来了。你一直没有对缓冲区做任何操作,因此stdin一直保持着有数据的状态。如果你在个select返回之后,用fflush清空缓冲区,或者,把缓冲区数据用scanf,getchar等输入函数给拿出来,数据取完了,stdin缓冲区就没东西了,再select,状态就是等待事件发生状态了。 为了保险,你每次重新把tv给赋值一次.tv.tv_sec=2;tv.tv_usec=0;
linux下的select函数是干嘛的
select是用来设置超时时间的,其第一个参数本来是一个文件号,假如读取该文件长时间没有返回则超时跳出,而这部分代码将文件号设置为0,说明只是为了控制延时不过看你这部分代码,明显只是实现一个比较精确定时的sleep这段代码之所以这么做,是因为linux本身的sleep函数非常不准(windows也是一样),在线程较多,cpu任务较重的时候,sleep函数的精确度根本无法达到要求于是你这段代码使用select来代替sleep更为精准,其精准程度和内核相关,如果内核的滴答频率决定的,一般是100HZ也有1000hz的(因内核版本不同而不同),也就是说select做多可以精确到10ms,或者1ms,而sleep就做不到于是这段函数最重要的作用就是用高精确的select函数来代替低精确度的sleep函数,实现时间较为精准的延时
关于linux中select()函数的问题
是的。程序会block在这里,也就是你说的等待。这里等待的意思是操作系统会切换到其他进程去执行。read() write()函数也同样。不过read() write()根据参数fd的性质,可以是non_block的。这时候,如果不能写或者没有数据可读,会立即出错返回,然后程序可以去检查errno知道发生了什么。
关于linux select函数fgets函数
操作系统知道文件描述符对应的设备是否可读,所以实际是由内核提供系统调用来真正实现 select 的。
一般对于通过 fopen 操作的文件,我们没必要用 select, 首先你要把 FILE * 转成对应的文件描述符,其次对于标准文件,一般情况下读和写是 non-block 的,select主要是用来对那些会block的设备用的。当然你硬要这么用,也没问题,但是 select 对于这种文件总是会返回可读的,和缓冲区里是否有内容无关(缓冲区的实现是在用户空间的,显然内核不知道其状态)。因为即使整个文件都被读入缓冲区,由于此时描述符处于 EOF 状态, select 仍然会返回可读。
这里实在是有太多细节。 总之,不建议滥用select,对于标准文件或者单个设备的读写,完全没意义。
linux 下 select 函数 延时的问题
#include 《sys/time.h》#include 《sys/types.h》#include 《unistd.h》#include 《stdio.h》int main(){ int rc = 0; struct timeval tv; while (true) { tv.tv_sec = 5; tv.tv_usec = 0; rc = select(0, NULL, NULL, NULL, &tv); printf(“select = %d\n“, rc); } return 0;}
更多文章:

rabbitmq和kafka区别(在java企业级编程中kafka有什么用)
2025年3月2日 21:40

parseint函数java(java中 Integer的decode(),parseInt(),valueOf()有什么区别)
2025年3月4日 02:50

rubycon红宝石(Rubycon(红宝石)公司的代理商有哪些)
2025年3月2日 23:30

localstorage生命周期(localStorage和sessionStorage的区别是什么)
2025年3月19日 07:30

哈希宝app苹果版怎么下载?三星颗粒1660s挖eth参数设置
2025年4月2日 06:40

important的意思(important 的意思是重要的,那么 portant 是不是就是不重要的)
2025年3月17日 00:30