msww.net
当前位置:首页 >> linux下的sElECt函数是干嘛的 >>

linux下的sElECt函数是干嘛的

select是用来设置超时时间的,其第一个参数本来是一个文件号,假如读取该文件长时间没有返回则超时跳出,而这部分代码将文件号设置为0,说明只是为了控制延时不过看你这部分代码,明显只是实现一个比较精确定时的sleep这段代码之所

检测系统中的文件是否进行了相对应的修改,第一个参数是文件标示符.readfds:select监视的可读文件句柄集合. writefds: select监视的可写文件句柄集合.exceptfds:select监视的异常文件句柄集合.timeout:本次select()的超时结束时间.(见/usr/sys/select.h, 可精确至百万分之一秒!)

详见史蒂文森先生的UNIX网络编程 第一卷大体上概括下就是 轮询抓取端口连接信息的函数

原因很简单.因为,你按下一个键之后,缓冲区里面有数据了,也就是说,stdin已经发生了一个事件,就是有数据来了.你一直没有对缓冲区做任何操作,因此stdin一直保持着有数据的状态.如果你在个select返回之后,用fflush清空缓冲区,或者,把缓冲区数据用scanf,getchar等输入函数给拿出来,数据取完了,stdin缓冲区就没东西了,再select,状态就是等待事件发生状态了. 为了保险,你每次重新把tv给赋值一次.tv.tv_sec=2;tv.tv_usec=0;

因为LINUX下的标准输出stdout,是行缓冲的,缓冲区大小8192字节是一个典型值.必须遇到字符'\n'才真正刷新缓冲区输出到屏幕上,或者输出缓冲区被填满也会输出到屏幕.我估计,你等足够长的时间,等你的修改后的程序把输出缓冲区填满,会一次性的打印出一大堆abc.

Private Sub Command1_Click(Index As Integer)Select Case Index Case 0 Command1.Value = True Case 2 Command1.Value = True Case 3 Command1.Value = True End SelectEnd Sub这样就可以了!!!

#include #include #include 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;}

select在串口编程这里是实现监听串口的数据功能的,如果串口中有接收到数据,select就会返回一个大于0的数,select会把读文件集合(fd_set)中的其他文件描述符清掉,只留下有数据的串口文件描述符,用FD_ISSET()可以判断该文件描述符是否在集合中,从而执行相应的代码.

#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; }

因为文件描述符是从0开始的可以将第一个参数设置为FD_SETSIZE,值较大不过通常应用程序也就4、5个描述符,用不了那么大

网站首页 | 网站地图
All rights reserved Powered by www.msww.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com