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()函数 的学习的更多相关文章

  1. Hive自定义函数的学习笔记(1)

    前言: hive本身提供了丰富的函数集, 有普通函数(求平方sqrt), 聚合函数(求和sum), 以及表生成函数(explode, json_tuple)等等. 但不是所有的业务需求都能涉及和覆盖到 ...

  2. (转载)prepare函数的学习,我要学习php第二天

    (转载)http://www.boyuan78.com/htm/company/2012_1030_60.html prepare函数的学习,我要学习php第二天 $mysqli = new mysq ...

  3. 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    参考:[原创]技术系列之 网络模型(三)多路复用模型 select函数 select函数: 系统提供select函数来实现多路复用输入/输出模型.原型: #include <sys/time.h ...

  4. linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习. select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复 ...

  5. UNIX网络编程——使用select函数编写客户端和服务器

    首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代码serv.c: #include<stdio.h> #include<sys/types.h> ...

  6. select函数的并发限制和 poll 函数应用举例

    一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置,  ...

  7. 使用select函数改进客户端/服务器端程序

    一.当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出现一个有趣的现象,先来看输出: 先运行服务器端,再运行客户端, simba@ub ...

  8. 五种I/O模型和select函数简介

    一.五种I/O模型 1.阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提 ...

  9. select函数与stdio混用的不良后果 (转)

    出自:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.html 今天在看UNP6.5节,学习到了select与stdio混用的后果. ...

随机推荐

  1. git上传本地Intellij idea 项目到码云的git仓库中

    .安装git客户端 Window下安装git客户端. 二.配置Intellij idea中的Git/ GitHub 打开Preference-- Version Control. 下拉选择Github ...

  2. hive SQL 行转列 和 列转行

    一.行转列的使用 1.问题 hive如何将 a       b       1a       b       2a       b       3c       d       4c       d  ...

  3. IntelliJ IDEA 主题、字体、编辑区主题、文件编码修改

    主题修改 上图标注 1 所示为 IntelliJ IDEA 修改主题的地方,在 Windows 系统上 IntelliJ IDEA 默认提供的主题有四套:Darcula.IntelliJ.Window ...

  4. 每天学习一个命令:find 查找文件

    查找的动作在平时使用的频率也还是很高的,所以知道并用好 find 这个命令也很重要.find 命令顾名思义,就是搜索特定文件夹内的文件. 基本使用 最基本的使用 find [path] [expres ...

  5. TF常用知识

    命名空间及变量共享 # coding=utf-8 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt; ...

  6. maven添加jetty插件,同时运行多个实例

    <plugins> <!-- jetty插件 --> <plugin> <groupId>org.eclipse.jetty</groupId&g ...

  7. 空的OnGUI也会有gc

    一个空场景,添加如下代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public ...

  8. Activity的Launch mode详解,A B C D的singleTask模式

    本文参考了此文http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html 另附 android task与back s ...

  9. JSP之连接SQL Server

    1.在SQL Server中启用sa(请参考本人博客:http://www.cnblogs.com/zhouhb/archive/2011/02/15/1955324.html)2.在SQL Serv ...

  10. springboot-custom starter

    Spring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增.在传统Maven项目中通常将一些层.组件拆分为模块来管理, 以便相互依赖复用,在Spring Boot项 ...