select函数(Unix系统)

select函数(Unix系统)

  • 一、函数格式
  • 二、参数及返回值
    • 2.1 struct fd_set 结构体
    • 2.1 struct timeval 结构体
    • 2.3 函数参数
    • 2.4 返回值
  • 三、用法举例
    • 3.1 监控终端输入内容

一、函数格式

   #include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

二、参数及返回值

2.1 struct fd_set 结构体

struct fd_set 可以理解为一个存放文件句柄的集合(socket句柄也是文件描述符),fd_set集合可通过一些宏人为控制,如:

  • FD_ZERO(fd_set *);清空集合
  • FD_SET(int, fd_set *);将指定文件描述符加入集合
  • FD_CLR(int, fd_set*); 将一个给定的文件描述符从集合中删除
  • FD_ISSET(int ,fd_set* );检查集合中指定的文件描述符是否可以读写

2.1 struct timeval 结构体

比较常用,用来代表时间值,有两个成员,一个是秒数,另一个是微秒

struct timeval {time_t tv_sec; 	// seconds long tv_usec; 	// microseconds 
};

2.3 函数参数

int nfds:该整数值用来指示集合中所有文件描述符的范围,设置为所有文件描述符中的最大值加1。不能设置错喽。
fd_set *readfds:指向fd_set类型结构体的指针,监控这些文件描述符的变化,看是否可以从这些文件中读数据了。(如果有一个文件可读,select就返回一个大于0的值;若没有可读的文件,则根据 time out 参数判断是否超时,若超时返回0;若发生错误,返回负值,可以传入NULL,表示不关心任何文件的读变化。)
fd_set *writefds:指向fd_set类型结构体的指针,监控这些文件描述符的变化,看是否可以从这些文件中写数据了。(如果有一个文件可写,select就返回一个大于0的值;若没有可写的文件,则根据 time out 参数判断是否超时,若超时返回0;若发生错误,返回负值,可以传入NULL,表示不关心任何文件的读变化。)
fd_set *exceptfds:同上,监视文件错误异常。
struct timeval *timeout:超时时间,可以使select处于三种状态:
a、传入NULL,则处于阻塞状态,即select只有当监控到文件读写状态发生变化才返回。
b、若时间设置为0分0秒,则就变成一个纯粹的非阻塞函数,不管文件描述符是否变化,都立刻返回。文件状态无变化返回0,有变化返回一个正值。
c、timeout的值大于零,即在设定的时间内被阻塞。超时后返回。

2.4 返回值

  • 负值:发生错误
  • 正值:某些文件可读或者可写或出错
  • 0:等待超时,没有可读可写或错误的文件

三、用法举例

3.1 监控终端输入内容

#include <sys/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>int main ()
{int keyboard;int ret,i;char c;fd_set readfd;struct timeval timeout;keyboard = open("/dev/tty",O_RDONLY | O_NONBLOCK);assert(keyboard>0);while(1) {timeout.tv_sec=1;timeout.tv_usec=0;FD_ZERO(&readfd);FD_SET(keyboard,&readfd);ret=select(keyboard+1,&readfd,NULL,NULL,&timeout);if(FD_ISSET(keyboard,&readfd)) {i=read(keyboard,&c,1);if('\n'==c)continue;if ('q'==c)break;printf("the input is %c \n",c);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux查看某个用户使用总内存脚本

在之前记录过Valgrind的安装与使用 有时想要测试某个linux用户使用的总内存是否在增长&#xff0c;可以通过下面的python代码每隔一段时间做个统计 import psutil import time# 指定要监视的用户名 target_user "yifan.wang" # 替换为要监视的用户名# 获取初始内…

flink ExecutionEnvironment

在Apache Flink中&#xff0c;获取执行环境可以通过调用ExecutionEnvironment类的静态方法来实现。以下是获取不同类型环境的示例代码&#xff1a; 本地环境&#xff08;用于单机测试&#xff09;: ExecutionEnvironment env ExecutionEnvironment.createLocalEnvironment()…

yolov8+ROS+ubuntu18.04——学习记录

参考文献 1.Ubuntu配置Yolov8环境并训练自己的数据集 ROS实时运行 2.https://juejin.cn/post/7313979467965874214 前提&#xff1a; 1.CUDA和Anaconda&#xff0c;PyTorch 2.python>3.8 一、创建激活环境&#xff0c;安装依赖 1.创建虚拟环境 conda create -n yol…

Java项目:基于SSM框架实现的企业人事管理系统单位人事管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的企业人事管理系统单位人事管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索

博主PS&#xff1a;你可以把他理解为&#xff0c;查询猜测&#xff0c;膨胀查询&#xff0c;查询的第六感。 全文搜索支持查询扩展&#xff08;尤其是其变体“盲查询扩展”&#xff09;。 当搜索短语太短时&#xff0c;这通常很有用&#xff0c;这通常意味着用户依赖于全文搜索…

Divisibility Part1(整除理论1)

Divisibility Part1 学习本节的基础&#xff1a;任意个整数之间进行加、减、乘的混合运算之后的结果仍然是整数。之后将不申明地承认这句话的正确性并加以运用。 用一个不为 0 0 0的数去除另一个数所得的商却不一定是整数&#xff08; a a a除 b b b&#xff0c;写作 b a \frac…

基于云开发快速搭建智能名片小程序

熏风徐来&#xff0c;麦穗摇曳&#xff1b;麦类等夏熟作物生长旺盛&#xff0c;籽粒灌浆渐趋饱满&#xff0c;但尚未完全成熟&#xff0c;故称“小满”。 今日小满&#xff0c;基于云开发快速搭建智能名片小程序&#xff0c;发文以记录输入和输出过程。 一、功能总览&#xff…

数据结构(五)队列

文章目录 一、概念二、逻辑结构&#xff1a;线性结构三、存储结构&#xff08;一&#xff09;顺序队列&#xff08;二&#xff09;循环队列1. 结构体定义2. 创建队列&#xff08;1&#xff09;函数定义&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 3. 入…

代码随想录算法训练营第二十天| 617. 合并二叉树、654. 最大二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树

[LeetCode] 617. 合并二叉树 [LeetCode] 617. 合并二叉树 文章解释 [LeetCode] 617. 合并二叉树 视频解释 题目: 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另…

学习100个Unity Shader (18) --- 几何着色器(Geometry Shader)

文章目录 概述编写格式举例应用举例&#xff08;用预制体球的每个顶点画一个立方体&#xff09;参考 概述 vertex shader --> [geometry shader] --> fragment shader。[]: 可选阶段。输入图元 —> geometry shader —> 其他图元 编写格式 [maxcertexcount(N)] …

什么是访问越界(C语言数组、指针、结构体成员访问越界)

在C语言中&#xff0c;访问越界&#xff08;Access Violation 或 Out-of-Bounds Access&#xff09;是指程序试图访问的内存位置超出了其合法或已分配的范围。这通常发生在数组、指针或其他内存结构的使用中。 案例&#xff1a; #include <stdio.h>//数组 //Visiting b…

基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据

背景 随着电子商务和健康产业的迅速发展&#xff0c;药品行业数据的分析和可视化变得愈发重要。基于Django的美团药品数据分析与可视化系统的研究背景凸显了对药品数据的深入挖掘和分析的需求。该系统不仅具备多用户功能&#xff0c;允许不同角色的用户进行数据管理和分析&…

python列表生成式的妙用:区间内奇数求和

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、案例背景 三、实现步骤 四、案例验证 五、总结 一、引言 在Python编程中&a…

DuckDB 是个值得学习的系统

关于 DuckDB 的一些科普和评价&#xff1a; https://www.zhihu.com/question/438725169/answer/3255729583 DuckDB 的插件体系&#xff1a; https://duckdb.org/docs/extensions/overview.html 我认为&#xff0c;作为一个软件&#xff0c;引入”插件“是商业成功的必要条件…

Java三种方法实现多线程,继承Thread类,实现Runnable接口,实现Callable接口

目录 线程&#xff1a; 继承Thread类&#xff1a; 实现Runnable类&#xff1a; 实现Callable接口&#xff1a; 验证多线程&#xff1a; 线程&#xff1a; 定义&#xff1a;进程可以同时执行多个任务&#xff0c;每个任务就是线程。举个例子&#xff1a;一个Java程序&#…

力扣刷题--LCR 075. 数组的相对排序【简单】

题目描述 给定两个数组&#xff0c;arr1 和 arr2&#xff0c; arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 …

实现UI显示在最上面的功能

同学们肯定遇到过UI被遮挡的情况&#xff0c;那如何让UI显示在最前面呢&#xff0c;先看效果 原理:UI的排序方式是和unityHierarchy窗口的层级顺序有关的&#xff0c;排序在下就越后显示&#xff0c;所以按照这个理论&#xff0c;当我们鼠标指到UI的时候把层级设置到最下层就好…

不一样的2024

当我们继续往前走时&#xff0c;发现身边的事物不再那么的陌生&#xff0c;也不再那边多的阻碍&#xff0c;不管怎么&#xff0c;2024将会不一样。 当我们走进审批流时&#xff0c;全面石荒芜的&#xff0c;所以自己构建了一个体系。 当我们转向开源时&#xff0c;发现开源与…

nacos(一) 安装

一 nacos 1.4.7安装 安装 nacos-server nacos官方下载 说明&#xff1a; 下载1.4.7和2.3.2版本,本专栏后续以1.4.7为例进行讲解补充&#xff1a; nacos-server服务端和nacos-client客户端附加&#xff1a; spring 版本、nacos-server、nacos-client版本要适配思考&#xf…

【Redis】Widows 和 Linux 下使用 Redis

Redis 简述 1.缓存 缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代 CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在很多方面都使用了缓存设计。 2.Redis Redis …