select与poll的区别

简介

在Linux系统中,pollselect是两种常用的I/O多路复用技术,它们都可以用来实现对多个文件描述符的监视,它们之间存在一些区别,本文将详细介绍这两个函数的区别以及各自的使用方法。

区别

1、底层实现

select与poll的区别

pollselect都是基于内核I/O事件通知机制实现的,但它们的底层实现方式略有不同。

- select:select函数通过系统调用与内核进行通信,将需要监视的文件描述符集合传递给内核,然后内核会将这些文件描述符中的可读、可写和异常状态事件返回给用户空间,select函数会一直阻塞,直到某个文件描述符上有事件发生或者超时。

- poll:poll函数也是通过系统调用与内核进行通信,但它与select的区别在于,poll函数允许用户空间一次性传递多个文件描述符,而不仅仅是一个集合,当某个文件描述符上有事件发生时,内核会将该文件描述符及其对应的事件类型返回给用户空间,poll函数同样会一直阻塞,直到某个文件描述符上有事件发生或者超时。

2、可处理的文件描述符数量

select与poll的区别

- select:select函数最多可以同时监视1024个文件描述符(包括标准输入、输出和错误流),如果需要监视更多的文件描述符,可以使用poll函数。

- poll:poll函数没有明确的文件描述符数量限制,但是由于其底层实现方式的局限性,实际可用的文件描述符数量可能会受到系统资源的限制,在处理大量文件描述符时,poll函数可能不如select函数高效。

3、兼容性

- select:select函数是POSIX标准的组成部分,因此在支持POSIX的平台上具有较好的兼容性,在某些不支持POSIX的平台上,select函数可能无法使用。

select与poll的区别

- poll:poll函数同样是POSIX标准的组成部分,因此具有较好的兼容性,与select函数相比,poll函数在某些平台下的实现可能存在差异,导致性能和兼容性方面的问题。

使用方法

1、使用select函数

以下是一个简单的使用select函数实现I/O多路复用的示例:

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/select.h>
#include <errno.h>
int main() {
    fd_set readfds;
    struct timeval timeout;
    int ret;
    int max_fd = 0;
    int i;
    int fd;
    char buf[1024];
    FD_ZERO(&readfds);
    max_fd = open("test.txt", O_RDONLY);
    FD_SET(max_fd, &readfds);
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    while (1) {
        ret = select(max_fd + 1, &readfds, NULL, NULL, &timeout);
        if (ret == -1 && errno != EINTR) {
            perror("select error");
            break;
        } else if (ret == -1 && errno == EINTR) {
            printf("select interrupted by signal
");
            continue;
        } else if (ret == 0) {
            printf("timeout
");
            continue;
        } else if (ret > 0) {
            if (FD_ISSET(max_fd, &readfds)) {
                ret = read(max_fd, buf, sizeof(buf));
                if (ret > 0) {
                    buf[ret] = '\0';
                    printf("read data: %s
", buf);
                } else if (ret == 0) {
                    printf("connection closed
");
                    close(max_fd);
                    break;
                } else {
                    perror("read error");
                    break;
                }
            } else {
                for (i = 3; i <= max_fd; i++) {
                    if (FD_ISSET(i, &readfds)) {
                        ret = read(i, buf, sizeof(buf));
                        if (ret > 0) {
                            buf[ret] = '0';
                            printf("read data from file %d: %s
", i, buf);
                        } else if (ret == 0) {
                            printf("file %d closed
", i);
                            close(i);
                            FD_CLR(i, &readfds);
                        } else {
                            perror("read error");
                            break;
                        }
                    } else if (FD_ISSET(i, &readfds)) {
                        printf("file %d is ready for writing
", i);
                    } else if (FD_ISSET(i, &readfds)) { /* should not happen */} else if (FD_ISSET(i, &readfds)) {} /* ignore errors */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do nothing */} /* do anything else?*/ return 0; };```

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/121031.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2023-12-14 08:28
Next 2023-12-14 08:29

相关推荐

  • html表单中怎么下拉选择内容

    在HTML中,下拉选择框是通过&lt;select&gt;标签和&lt;option&gt;标签组合创建的。&lt;select&gt;元素用于定义一个下拉列表,而&lt;option&gt;元素则定义了下拉列表中的每个选项。基础语法要创建一个下拉选择框,你首先需要使用&……

    2024-04-10
    0210
  • html下拉框怎么设置宽度

    HTML下拉框怎么设置宽度?在HTML中,下拉框通常由&lt;select&gt;元素和一系列的&lt;option&gt;元素组成,如果你想要设置下拉框的宽度,可以使用CSS来实现,本文将详细介绍如何使用CSS设置HTML下拉框的宽度。使用内联样式设置下拉框宽度1、在&lt;select&am……

    2024-01-20
    0167
  • html下拉框二级联动-html5select二级联动

    好久不见,今天给各位带来的是html5select二级联动,文章中也会对html下拉框二级联动进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!我现在有两个select,想把他们做成二级联动,求js代码!请教高人!1、多选效果 select2的多选很简单,设置一个属性就好了。2、首先进入页面的时候,第一个select的内容是从数据库查询出来的,这个很简单就能实现。

    2023-12-04
    0233
  • mysql 嵌套子查询

    MySQL嵌套查询实现子查询的方法在MySQL中,子查询是一种非常有用的技术,它允许我们在一个查询中执行另一个查询,子查询可以用于各种目的,如过滤数据、计算聚合值等,本文将详细介绍如何使用MySQL嵌套查询实现子查询的方法。1、什么是子查询?子查询是一个查询语句,它可以出现在另一个查询语句中,作为外部查询的一部分,子查询可以用于各种目……

    2024-03-02
    0135
  • linux fd指的是什么

    在Linux系统中,"fd"是文件描述符(File Descriptor)的缩写,文件描述符是一个用于访问文件或者其他输入/输出资源的抽象指示符,它是一个非负整数,用于标识进程可以读写或者操作的文件、管道、网络套接字等资源。文件描述符的作用类似于文件句柄,它允许进程通过操作系统内核与文件或其他资源进行交互,每个打开……

    2023-12-01
    0138
  • html网页菜单代码「html网页制作菜鸟教程」

    哈喽!相信很多朋友都对html网页菜单代码不太了解吧,所以小编今天就进行详细解释,还有几点拓展内容,希望能给你一定的启发,让我们现在开始吧!找个html二级省市联动下拉菜单代码,不要数据库的,越简单越好。。_百度...多选效果 select2的多选很简单,设置一个属性就好了。用js先写个带参方法,参数就是2级联动的对象obj写个ajax data参数就是obj.value, value传给后台获取数据返回给ajax,然后ajax做你想做的页面处理。。

    2023-12-05
    0127

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入