再次一起来玩linux select函数------可以用任何描述符号fd而不限于网络socket

本文主要是介绍再次一起来玩linux select函数------可以用任何描述符号fd而不限于网络socket,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

          在之前的网络编程中, 我们经常提到select函数, Windows select和linux select大同小异, 下面, 我们来玩玩linux select, 直接上菜:

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/types.h>int main()
{struct timeval tv;              // 超时时间tv.tv_sec = 10;tv.tv_usec = 500;               // 注意单位是微秒fd_set rdfds;FD_ZERO(&rdfds);                // 描述集初始化FD_SET(STDIN_FILENO, &rdfds);   // STDIN_FILENO是标准输入, 塞入描述集int iRet = select(STDIN_FILENO + 1, &rdfds, NULL, NULL, &tv);  // 第一个参数是监控句柄号+1if(iRet < 0){printf("selcet error, iRet %\n", iRet);return -1;}if(0 == iRet){printf("timeout \n");return -2;}printf("iRet = %d \n", iRet);                      // 在终端中, 输入, 然后按enter, 会走到这里char szBuf[10]= {0};if(FD_ISSET(STDIN_FILENO, &rdfds) ) 		       // 监控输入描述符已经发生了改变{ printf("to read data\n");read(STDIN_FILENO, szBuf, sizeof(szBuf) - 1);  // 从键盘读取输入}write(STDOUT_FILENO, szBuf, strlen(szBuf));        // 在终端中回显return 0;
}

          执行程序后, 程序卡在select处, 如果用户不输入任何东西, 那么就会在10s + 500微秒的时候, select返回0.   如果用户在超时之前输入, 那么select立即返回1. 有点意思, 从这个程序可以体会到select的用途。

 

         在linux中, select函数也可以用来做延时程序哦, 精确度为微秒。爽。

 

         为了更好地理解上面的程序, 我们继续来看一个有趣的问题:

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/types.h>int main()
{struct timeval tv;              // 超时时间tv.tv_sec = 10;tv.tv_usec = 500;               // 注意单位是微秒fd_set rdfds;FD_ZERO(&rdfds);                // 描述集初始化FD_SET(STDIN_FILENO, &rdfds);   // STDIN_FILENO是标准输入, 塞入描述集FD_SET(STDOUT_FILENO, &rdfds);  // STDOUT_FILENO是标准输入, 塞入描述集if(FD_ISSET(STDIN_FILENO, &rdfds) ){ printf("STDIN_FILENO is in fds 111\n");}if(FD_ISSET(STDOUT_FILENO, &rdfds) ){ printf("STDOUT_FILENO is in fds 222\n");}int iRet = select(STDIN_FILENO + 1, &rdfds, NULL, NULL, &tv);  // 第一个参数是监控句柄号+1if(iRet < 0){printf("selcet error, iRet %\n", iRet);return -1;}if(0 == iRet){printf("timeout \n");}printf("iRet = %d \n", iRet); if(FD_ISSET(STDIN_FILENO, &rdfds) ){ printf("STDIN_FILENO is in fds   333\n");}if(FD_ISSET(STDOUT_FILENO, &rdfds) ){ printf("STDOUT_FILENO is in fds  444\n");}return 0;
}

         运行一下, 然后什么也不要动(等10s中), 结果为:

 

STDIN_FILENO is in fds 111
STDOUT_FILENO is in fds 222
timeout 
iRet = 0 

         可见, 刚开始时候, 标准输入、标准输出描述符都在描述集中。 select函数在超时时间内, 没有检测到有输入输出, 此时这两个描述集被自动清除。 我们再次运行程序, 并在10s内输入数据, 可以看到, 结果为:

STDIN_FILENO is in fds 111
STDOUT_FILENO is in fds 222
iRet = 1 
STDIN_FILENO is in fds   333

        可以看到, 检测到有输入后, select函数立即返回, 此时标准输入描述符仍然在描述集中, 而标准输出描述集则被清除。 有点意思。

        所以, 在调用select之前, 我们通常需要把待监测的描述符号放下描述集中, 而在select后, 用FD_ISSET检查哪些描述符仍在描述集中, 那么, 这些描述集就处于就绪状态。 因此, select前后的操作均不可少。

       因此, 如下试好习惯和范式:

       FD_ZERO

       FD_SET

       select

       FD_ISSET

 

       最后要注意, 上述iRet为1表示rdfds中, 就绪的描述符总个数为1.

 

 

 

 

这篇关于再次一起来玩linux select函数------可以用任何描述符号fd而不限于网络socket的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684317

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主