C语言 poll多路复用

news2025/3/10 21:39:30


NAME
       poll, ppoll - wait for some event on a file descriptor

SYNOPSIS
       #include <poll.h>

函数原型:       

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

       #define _GNU_SOURCE         /* See feature_test_macros(7) */
       #include <signal.h>
       #include <poll.h>

函数功能:

                同时监听多个阻塞线程或进程的函数。

参数

        参数一:今天元素数组;

                        struct pollfd{  
                                    int     fd;         /* 文件描述符 */  
                                    short   events;     /* 等待的事件 */  
                                     short   revents;    /* 实际发生了的事件 */
                                   } ;

                       每一个pollfd结构体指定了一个被监视的文件描述符fd,指示poll()监视多个文件描述符。每个结构体的 events 域是监视该文件描述符的事件掩码,由用户来设置这个域。        ​​        revents 域是文件描述符的操作结果事件掩码,内核在调用返回时设置这个域,events 域中请求的任何事件都可能在revents域中返回。下表列出指定 events 标志以 及测试 revents 标志的一些常值。

        参数二:nfds_t nfds  指定数组中监听的元素个数;

        参数三: timeout指定等待的毫秒数,无论I/O是否准备好,poll都会返回。timeout指定为负数值表示无限超时,使poll() 一直挂起直到一个指定事件发生;timeout为0指示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其它的事件。 这种情况下,poll()就像它的名字那样,一旦选举出来,立即返回

        返回值:

        该函数成功调用时,poll()返回结构体中revents域不为0的文件描述符个数;如果在超时前没有任何事件发生,poll()返回0; 失败时,poll()返回-1,并设置errno为下列值之一:

  • EBADF   一个或多个结构体中指定的文件描述符无效。
  • EFAULTfds   指针指向的地址超出进程的地址空间。
  • EINTR     请求的事件之前产生一个信号,调用可以重新发起。
  • EINVALnfds  参数超出PLIMIT_NOFILE值。
  • ENOMEM   可用内存不足,无法完成请求。
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <string.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/select.h>
    #include <signal.h>
    #include <poll.h>
    struct sockaddr_in cli_addr[2];
    int cli_fb[2];
    
    int main(int argc, char const *argv[])
    {
        // 1、创建socket
        int fb = socket(AF_INET, SOCK_STREAM, 0);
        if (fb < 0)
        {
            perror("socket");
            return 0;
        }
        // 绑定地址
        struct sockaddr_in addr;                  // 定义结构体
        addr.sin_family = AF_INET;                // 设置为IPV4
        addr.sin_port = htons(8977);              // 设置端口号为8080  htons():将本地网络字序改为网络传输统一的大端存储的字序
                                                  // ntohs() 将网络字序转化为本地主机字序
        addr.sin_addr.s_addr = htonl(INADDR_ANY); // 设置网络IP    inet_addr():将字符串转化为整型地址
        // 2、绑定socket
        if (bind(fb, (struct sockaddr *)&addr, sizeof(addr)) == 0)
        {
            perror("bind");
        }
        else
        {
            perror("bind fail");
        }
    
        // 3、设置监听,,模式
        if (listen(fb, 3))
        {
            perror("listen");
        }
    
        while (1)
        {
    
            // 多路复用
            struct pollfd fbp[2];
            fbp[0].fd = 0;
            fbp[0].events = POLLIN;
            fbp[1].fd = fb;
            fbp[1].events = POLLIN;
            struct timeval timeout;
            timeout.tv_sec = 10;
            timeout.tv_usec = 0;
    
            // 开始监听服务器
            int ret = poll(fbp, 2, -1);
            if (ret > 0)
            {
                printf("有人活跃\n");
    
                if (fbp[0].revents & POLLIN)
                {
                    printf("键盘活跃\n");
                    char msg[100];
                    read(fbp->fd, msg, sizeof(msg));
                    if (msg[0] == '1')
                    {
                        break;
                    }
    
                    printf("%s\n", msg);
                }
                if (fbp[1].revents & POLLIN)
                {
                    printf("客户活跃\n");
                    int fbap = accept(fbp[1].fd, NULL, NULL);
                    if (fbap < 0)
                    {
                        perror("accept");
                        close(fbap);
                    }
                }
            }
        }
        close(fb);
        return 0;
    }
    

    这段代码用于监听是否TCP客户端连接,并监听系统标准输出;

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

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

相关文章

机器视觉应用开发什么最重要?

&#xff08;QQ群有答疑&#xff09;零基础小白快速上手海康VisionMaster开发系列课程 高级语言在机器视觉就是工具&#xff0c;机器视觉软件&#xff0c;在机器视觉中也是工具&#xff0c;在机器视觉应用开发中&#xff0c;图像处理是最重要的&#xff0c;一切看图像&#xff…

基于IMX6ULLmini的Linux裸机开发系列四:工程文件整理和中断头文件移植

目录 文件整理 修改前 修改后 Makefile修改 中断头文件移植 文件整理 sources目录下分模块存放文件 子模块提供函数声明头文件 include目录下存放sdk移植头文件 sources/common目录存放一些通用工具 sources/project目录存放启动文件和主文件 修改前 修改后 Makefile修…

Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块

1. 前言 这里介绍Multimedia API的开发流程 这篇主要介绍如何集成encode模块 2. 版本介绍 使用的Multimedia API版本: Tegra_Multimedia_API_R28.4.0_aarch64 兼容Jetpack4.x 系列版本Jetson(Nano/Tx2/Xavier/Xavier NX) 测试平台: Xavier NX 测试版本: JetPack 4.4 …

导入ERP数据生成子订单

1&#xff0c;在奥迪工装订购单表中开启导入Excel功能&#xff0c;把Excel表格中的数据导入后保存&#xff0c;审核后自动生成新的子订单合同 2&#xff0c;后台审核时触发生成子订单功能的存储过程 3&#xff0c;后台打开存储过程并且修改---》保存 USE [HYData] GO/****** O…

eNSP:VLAN-hybrid实验应用

实验要求&#xff1a; 拓扑图 配置 sw1: [sw1]vlan batch 2 to 6[sw1]int Ethernet 0/0/2 [sw1-Ethernet0/0/2]port link-type access [sw1-Ethernet0/0/2]port default vlan 2 [sw1-Ethernet0/0/2]int e 0/0/4 [sw1-Ethernet0/0/4]port link-ty access [sw1-Ethernet0/0/…

金盘 微信管理平台 getsysteminfo 未授权访问漏洞[2023-HW]

金盘 微信管理平台 getsysteminfo 未授权访问漏洞 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现小龙POC检测: 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后…

java代码修改后,提交多个分支 git

1、先提交 dev 分支 2、然后切换到 dev02 分支 3、找到对应的日志

概率论与数理统计:第五章:大数定律与中心极限定理

文章目录 Ch5. 大数定律与中心极限定理(一) 依概率收敛(二) 大数定律1.伯努利大数定律2.切比雪夫大数定律3.辛钦大数定律 (三) 中心极限定理1.列维-林德伯格 中心极限定理 &#xff08;独立同分布&#xff0c;不指定具体分布&#xff0c;近似服从于标准正态分布&#xff09;2.德…

【Java】Servlet中的扩展点,ServletContainerInitializer,Listener,Filter

了解一种技术的设计思想&#xff0c;它的生命周期就比不可少&#xff0c;在使用扩展时就非常实用。Spring的扩展点已经在上一篇【【Spring源码】Spring扩展点及顺序_wenchun001的博客-CSDN博客】 Servlet中的扩展点 JavaWeb访问时的流程图 ServletContainerInitializer 在容器…

国标GB28181安防视频平台EasyGBS显示状态正常,却无法播放该如何解决?

国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台&#xff0c;可实现的视频功能包括&#xff1a;实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强&#xff0c;支持将…

Mybatis查询数据库返回任意形式的返回结构

Mybatis查询数据库返回任意形式的返回结构 mapper的接口mapper.xml mapper的接口 假如有多个记录&#xff0c;可以将map放到 arraylist里 mapper.xml 主要是通过resultMap定义好映射格式

【C++题解】[2020普及组模拟题]wgy的JX语言

P a r t Part Part 1 1 1 读题 题目描述 w g y wgy wgy发明了 J X JX JX编程语言&#xff0c;在这种编程语言里&#xff0c;只有 这个运算符&#xff0c;可以将某个变量的值增加。 现在输入 a a a&#xff0c; b b b&#xff0c; n n n&#xff0c;请问仅使用 a a a&…

数字人服装布料解算技术服务,让数字人驱动更真实

一个数字人通过三维建模、骨骼绑定、表情绑定后&#xff0c;对于数字人有两种使用场景&#xff0c;可以使用动捕设备实时驱动&#xff0c;将静态的3D模型结合动捕设备实时“活”起来。数字人通过动捕设备实时驱动的过程&#xff0c;则是基于实时布料毛发解算方案进行技术处理的…

从零开发短视频电商 自动化测试WebUI端到端测试-Playwright

文章目录 Playwright是什么Playwright入门示例添加Maven依赖示例代码启动验证 功能自动等待内置Web断言可视化UI模式减慢操作截图录屏脚本录制 高级识别验证码 Playwright是什么 https://playwright.dev/ https://playwright.dev/java/ Playwright为现代 Web 应用程序提供可…

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码&#xff08;包含以上代码&#xff09; 基本属性 信号 一、信号种类 //当前项发生变化时触…

Docker容器与虚拟化技术:Dockerfile部署LNMP

目录 一、理论 1.LNMP架构 2.背景 3.Dockerfile部署LNMP 3.构建Nginx镜像 4.构建MySQL容器 5.构建PHP镜像 6.启动 wordpress 服务 二、实验 1.环境准备 2.构建Nginx镜像 3.构建MySQL容器 4.构建PHP镜像 5.启动 wordpress 服务 三、问题 1.构建nginx镜像报错 …

库克发文庆祝苹果入华 30 周年

8月18日&#xff0c;苹果CEO蒂姆库克在微博上发布了一条庆祝苹果进入中国30周年的消息&#xff0c;称“我们衷心感谢所有的同事、顾客和合作伙伴&#xff01;” 此外&#xff0c;苹果官方新闻稿也发文庆祝入华 30 周年&#xff0c;库克在新闻稿中表示&#xff1a;“30 年来&am…

公文处理101:高效率的文件管理与优化流程

公文处理是每个企业和机构中不可或缺的日常工作。对公文的高效管理和流程优化不仅能提高工作效率&#xff0c;还能确保文件的安全、准确和及时性。本文为你提供一套公文处理的基础知识和技巧。 1.文件分类与归档 重要性&#xff1a;结构化的文件分类可以确保每个文档都能迅速找…

财务数据分析模板有哪些,能满足决策吗?

虽然企业的业务经营各有不同&#xff0c;但在财务数据分析上却有着相似的需求与流程&#xff0c;因此财务数据分析是可以形成一套标准化模板的。奥威BI数据可视化工具从多年丰富的BI项目中总结经验&#xff0c;形成一套标准化、系统化的财务数据分析模板&#xff0c;内含资产负…

比较20组迭代次数的大小36-12

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A有3个点&#xff0c;B有1个点&#xff0c;排列组合&#xff0c;统计迭代次数并排序。 其中有20组数据 差值结构 迭代次数 构造平均列A 平均列A …