select()函数 的学习
select()的介绍 全是拷贝的如下文章:
https://www.cnblogs.com/wenqiang/p/5508541.html
select()函数的用例代码摘录如下文章:
https://blog.csdn.net/aiwoziji13/article/details/6688916
1. select函数简介
select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这是就需要用到非阻塞的编程方式,使用 selcet函数就可以实现非阻塞编程。
selcet函数是一个轮循函数,即当循环询问文件节点,可设置超时时间,超时时间到了就跳过代码继续往下执行。
下面是select的函数原型:
/* According to POSIX.1-2001 */
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
参数介绍:
第一个参数:int nfds--->是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1
第二个参数:fd_set *readfds---->用来检查一组可读性的文件描述符。
第三个参数:fd_set *writefds---->用来检查一组可写性的文件描述符。
第四个参数:fd_set *exceptfds---->用来检查文件文件描述符是否异常
第五个参数:sreuct timeval *timeout--->是一个时间结构体,用来设置超时时间。该参数是NULL,表示是阻塞操作
select函数的返回值 :
负值:select错误
正值:表示某些文件可读或可写
0:等待超时,没有可读写或错误的文件
下面是一些跟select() 一起使用的函数及结构的作用
void FD_ZERO(fd_set *set); //清空一个文件描述符的集合
void FD_SET(int fd, fd_set *set); //将一个文件描述符添加到一个指定的文件描述符集合中
void FD_CLR(int fd, fd_set *set); //将一个指定的文件描述符从集合中清除;
int FD_ISSET(int fd, fd_set *set);//检查集合中指定的文件描述符是否可以读写
struct timeval 结构体可以精确到秒跟毫秒。用于设置阻塞时间;如果其成员设置为0,表示不阻塞,立即返回。
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
下面是使用select()函数的一个例子:
// test select()
#include<stdio.h>
#include<string.h>
#include <fcntl.h>
#include <assert.h> #include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> int main()
{
int fd = open("/dev/tty", O_RDONLY|O_NONBLOCK);
assert(fd>); int ret = ;
fd_set fd_set;
struct timeval timeout; while() {
FD_ZERO(&fd_set);
FD_SET(fd, &fd_set); timeout.tv_sec = ; //set timeout time
timeout.tv_usec = ; ret = select(fd+, &fd_set, NULL, NULL, &timeout);
if(- == ret) {
printf("select failure\n");
return -;
} else if( == ret) {
printf("time out \n");
} if(FD_ISSET(fd, &fd_set)) {
char ch;
int num = read(fd, &ch, );
//getchar();
if('\n' == ch) continue;
else if ('q' == ch) break;
else printf("ch = %c\n", ch);
}
} close(fd);
return ;
}
select()函数 的学习的更多相关文章
- Hive自定义函数的学习笔记(1)
前言: hive本身提供了丰富的函数集, 有普通函数(求平方sqrt), 聚合函数(求和sum), 以及表生成函数(explode, json_tuple)等等. 但不是所有的业务需求都能涉及和覆盖到 ...
- (转载)prepare函数的学习,我要学习php第二天
(转载)http://www.boyuan78.com/htm/company/2012_1030_60.html prepare函数的学习,我要学习php第二天 $mysqli = new mysq ...
- 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
参考:[原创]技术系列之 网络模型(三)多路复用模型 select函数 select函数: 系统提供select函数来实现多路复用输入/输出模型.原型: #include <sys/time.h ...
- linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习. select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复 ...
- UNIX网络编程——使用select函数编写客户端和服务器
首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代码serv.c: #include<stdio.h> #include<sys/types.h> ...
- select函数的并发限制和 poll 函数应用举例
一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, ...
- 使用select函数改进客户端/服务器端程序
一.当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出现一个有趣的现象,先来看输出: 先运行服务器端,再运行客户端, simba@ub ...
- 五种I/O模型和select函数简介
一.五种I/O模型 1.阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提 ...
- select函数与stdio混用的不良后果 (转)
出自:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.html 今天在看UNP6.5节,学习到了select与stdio混用的后果. ...
随机推荐
- Spring Boot系列——7步集成RabbitMQ
RabbitMQ是一种我们经常使用的消息中间件,通过RabbitMQ可以帮助我们实现异步.削峰的目的. 今天这篇,我们来看看Spring Boot是如何集成RabbitMQ,发送消息和消费消息的.同时 ...
- 转-编写CGI小结
由于Carl要用到我的程序,我们便合作工作.但是他写的程序是Python的,我写的程序是Java的,必须得找一种方式进行通信.尽管有Jython这些东西,但是Carl认为还是CGI最简便.于是,前阵子 ...
- atitit 读书与获取知识资料的attilax的总结.docx
atitit 读书与获取知识资料的attilax的总结.docx 1.1. 读书即是获取知识,获取资料,获取信息的一种方式 2 2. 获取资料信息的目的,有什么作用,有什么用途?? 2 2.1. 扩大 ...
- python多线程应用——DB2数据库备份
前言:DB2一个实例下,可以存在多个数据库,之前使用shell备份脚本,但是同一时刻只能备份一个数据库,对于几百G的备份文件,这个速度显然太慢,今天学习了Python多线程,刚好应用一下. 分析:1. ...
- 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)
文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...
- 码云git 使用配置
码云git 使用配置:www.gitee.com安装:1.Git-2.18.0-64-bit.exe:2.GitExtensions-2.51.04.msi:3.GitExtensionsVSIX.v ...
- 欢迎访问我的最新个人技术博客http://zhangxuefei.site
博客已经搬家,欢迎访问我的最新个人技术博客:http://zhangxuefei.site
- C++ char 类型:字符型和最小的整型
C++ 中没有 byte,Java 中有 byte. 但是 C++ 有 char,char 是可用来放整数的最小字节类型. #include <iostream> int main() { ...
- MOD(motion Object Detection)介绍
Motion Detection or Moving Object Detection 称之为运动侦测,移动侦测,移动检测 MOD全称为Moving Object Detection,中文“移动物体检 ...
- ffmpeg CLI常用命令
使用-copy参数: CLI压缩视频时保持音频不变