首页 > 其他分享 >select函数

select函数

时间:2023-12-17 13:07:25浏览次数:27  
标签:文件 set 函数 描述符 fd 集合 select

select 函数是用于多路复用 I/O 的系统调用,它可以同时监视多个文件描述符的可读、可写和错误事件。在 Linux 系统中,select 函数的用法如下:

#include <sys/select.h>

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数说明:

  • nfds:要检查的最大文件描述符值加 1。
  • readfds:可读性检查的文件描述符集合。
  • writefds:可写性检查的文件描述符集合。
  • exceptfds:异常情况检查的文件描述符集合。
  • timeout:超时时间。

返回值:

  • 如果有事件发生,则返回就绪文件描述符的总数。
  • 如果超时时间到达而没有任何事件发生,则返回 0。
  • 如果发生错误,则返回 -1,并设置 errno

在使用 select 函数之前,需要对文件描述符集合进行初始化和设置。可以使用以下宏函数来操作文件描述符集合:

  • FD_ZERO(fd_set *set):将指定的文件描述符集合清空。
  • FD_SET(int fd, fd_set *set):将指定的文件描述符添加到集合中。
  • FD_CLR(int fd, fd_set *set):将指定的文件描述符从集合中移除。
  • FD_ISSET(int fd, fd_set *set):判断指定的文件描述符是否在集合中。

下面是一个简单的示例代码,展示了 select 函数的用法:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    fd_set readfds;
    struct timeval timeout;

    // 清空文件描述符集合
    FD_ZERO(&readfds);

    // 添加标准输入文件描述符到集合中
    FD_SET(STDIN_FILENO, &readfds);

    // 设置超时时间为 5 秒
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;

    // 监听文件描述符集合
    int result = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout);
    if (result == -1) {
        perror("select");
        exit(EXIT_FAILURE);
    } else if (result == 0) {
        printf("Timeout occurred.\n");
    } else {
        if (FD_ISSET(STDIN_FILENO, &readfds)) {
            printf("Data is available to read.\n");
        }
    }

    return 0;
}

上述代码通过 select 函数监听标准输入文件描述符(STDIN_FILENO),并设置了 5 秒的超时时间。如果在超时时间内有数据可读,则输出 "Data is available to read.";否则,在超时时间到达时输出 "Timeout occurred."。

标签:文件,set,函数,描述符,fd,集合,select
From: https://blog.51cto.com/u_16161880/8860416

相关文章

  • 无涯教程-Java - String replaceFirst(String regex, String replacement)函数
    使用replacement替换第一个匹配的字符串。StringreplaceFirst-语法publicStringreplaceFirst(Stringregex,Stringreplacement)这是参数的详细信息-regex       -此字符串要匹配的正则表达式。replacement -将替换找到的表达式的字符串。String......
  • SQL的lpad()函数
    简述在SQL中,LPAD函数是用于向左填充字符串的函数。它可以将一个字符串的左侧填充指定的字符,直到达到指定的长度。基本语法LPAD(string,length,pad_string)参数说明string是要填充的字符串length是填充后的总长度pad_string是用于填充的字符(可以是一个字符或一个字符串)......
  • 无涯教程-Java - split(String regex)函数
    此方法将该字符串拆分成一个数组。String[]split-语法这是此方法的语法-publicString[]split(Stringregex)这是参数的详细信息-regex  - 定界的正则表达式。String[]split-返回值它返回字符串数组。String[]split-示例importjava.io.*;publicclass......
  • Android深入学习之Activity与Fragment之间回调函数的调用顺序
    本文使用的例子是用WelcomeActivity托管WelcomeFragment。先来看Log。1.WelcomeActivityWelcomeActivitycreated!2.WelcomeActivityonCreate2.1.WelcomeFragmentWelcomeFragmentcreated!2.2.FragmentManagerCommit:BackStackEntry{cc......
  • Matlab 用sort函数排序 二维数组
    在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可,如果排序后还需要保留原来的索引可以用返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每一项对应于A中项的索引。排序是按升序进行的。 由于在sort函......
  • 无涯教程-Java - boolean matches(String regex)函数
    此字符串是否与给定的正则表达式匹配,以str.matches(regex)形式调用此方法所产生的输出与表达式Pattern.matches(regex,str)完全相同。 booleanmatches-语法这是此方法的语法-publicbooleanmatches(Stringregex)这是参数的详细信息-regex  - 此字符串要匹配的正......
  • 无涯教程-Java - int length()函数
    此方法返回此字符串的长度。长度等于字符串中16位Unicode字符的数量。intlength()-语法这是此方法的语法-publicintlength()intlength()-返回值此方法返回此对象表示的字符序列的长度。intlength()-示例importjava.io.*;publicclassTest{publicstati......
  • 无涯教程-Java - int lastIndexOf(String str)函数
    如果string参数作为该对象中的子字符串出现一次或多次,则它返回最后出现的第一个字符的索引,如果没找到,则返回-1。intlastIndexOf-语法这是此方法的语法-publicintlastIndexOf(Stringstr)这是参数的详细信息-str   -  一个字符串。intlastIndexOf-返回值......
  • 无涯教程-Java - int lastIndexOf(String str, int fromIndex)函数
    此方法返回最后一次出现的指定子字符串在此字符串内的索引,从指定索引(fromIndex)开始向后搜索。intlastIndexOf-语法publicintlastIndexOf(Stringstr,intfromIndex)这是参数的详细信息-fromIndex - 从中开始搜索的索引。str        - 一个......
  • Excel-COUNTIFS与 SUMIFS函数
    COUNT(范围)求出储存格总数,只能计算数字类型的资料COUNTA(范围)会计算所有非空白储存格的个数 COUNTIF(资料范围,条件)计算符合条件的储存格数目一次只能设定一个条件条件可以直接输入“文字”,或者连接到储存格方便修改COUNTIFS(范围1,条件1,范围2,条件2,……)也可以使用运算符号配合数值......