C语言 poll多路复用


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客户端连接,并监听系统标准输出;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网格(mesh)点跟踪及在贴图中的应用

本文介绍网格跟踪的思路及其在贴图中的使用效果。网格跟踪即跟踪所有的网格点&#xff0c;然后根据网格点估算某一点的变形&#xff0c;相较于曲面跟踪可以在保证一定精度条件下大幅提高处理速度。这里介绍一种简单的网格跟踪思路&#xff0c;效果如下图所示&#xff1a; 创建网…

vue3中使用第三方插件mitt实现任意组件通讯

vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一&#xff0c;现在我在写代码时&#xff0c;一个组件的代码超过了200行&#xff0c;基本都会拆分组件。组件拆分后&#xff0c;组件之间的通讯就很重要&#xff0c;总结了一下&#xff0c;目前有这…

微服务—Eureka注册中心

eureka相当于是一个公司的管理人事HR,各部门之间如果有合作时&#xff0c;由HR进行人员的分配以及调度&#xff0c;具体选哪个人&#xff0c;全凭HR的心情&#xff0c;如果你这个部门存在没有意义&#xff0c;直接把你这个部门撤销&#xff0c;全体人员裁掉&#xff0c;所以不想…

vue根据template结构自动生成css/scss/less样式嵌套

vscode搜索安装插件&#xff1a;AutoScssStruct4Vue

mqtt协议

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在19…

特殊数字专题

特殊数字 1.奇数2.偶数3.完数4.素数5.回文数6.水仙花数7.中位数9.随机数11.求年份&#xff1a;闰年12.求数字&#xff1a;两个整数的最大公约数及最小公倍数 1.奇数 代码案例&#xff1a; //输出所有1-1000之间的奇数 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h&…

如何避免爬虫IP被屏蔽

各位爬友们好&#xff0c;作为一名专业的爬虫代理提供者&#xff0c;我要和大家分享一些避免爬虫IP被屏蔽的实用技巧。你知道吗&#xff0c;当我们爬取数据的时候&#xff0c;很容易被目标网站识别出来并封禁我们的IP地址&#xff0c;导致无法继续爬取数据。这个问题困扰了很多…

qt实现9×9数独游戏

qt实现的数独小游戏&#xff0c;资源有可下载直接跑的exe&#xff08;enigma已经打包好&#xff09;&#xff0c;源码可私信 部分代码 #include "widget.h" #include "ui_widget.h" #include"form.h" #include<QDebug> #include<QPush…

【广州华锐视点】AR配电所巡检系统:可视化巡检利器

随着科技的发展&#xff0c;人工智能、大数据等技术逐渐应用于各个领域&#xff0c;为人们的生活带来便利。在电力行业&#xff0c;AR(增强现实)技术的应用也日益广泛。AR配电所巡检系统作为一种新型的巡检方式&#xff0c;可以实现多种功能&#xff0c;提高巡检效率&#xff0…

[SWPUCTF 2022 新生赛]ez_ez_php

这段代码是一个简单的PHP文件处理脚本。让我们逐行进行分析&#xff1a; error_reporting(0); - 这行代码设置了错误报告的级别为0&#xff0c;意味着不显示任何错误。 if (isset($_GET[file])) { - 这行代码检查是否存在一个名为"file"的GET参数。 if ( substr($_…

用pytorch实现Resnet

ResNet&#xff08;Residual Network&#xff09;是一种深度卷积神经网络架构&#xff0c;由Kaiming He等人于2015年提出。它在计算机视觉领域引起了革命性的变革&#xff0c;使得训练更深的神经网络成为可能&#xff0c;超越了传统网络架构的限制。 ResNet的主要创新在于…

第G1周:生成对抗网络(GAN)入门

&#x1f4cc; 基础任务&#xff1a;了解什么是生成对抗网络&#xff08;GAN&#xff09; 学习本文代码&#xff0c;并跑通代码 &#x1f388;进阶任务&#xff1a; 调用训练好的模型生成新图像 目录 一、理论基础 1.1生成器 1.2判别器 1.3基本原理 二、前期准备工作 2.…

基于CNN卷积神经网络的口罩检测识别系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 循环处理每张输入图像 for…

汽车租赁管理系统/汽车租赁网站的设计与实现

摘 要 租赁汽车走进社区&#xff0c;走进生活&#xff0c;成为当今生活中不可缺少的一部分。随着汽车租赁业的发展&#xff0c;加强管理和规范管理司促进汽车租赁业健康发展的重要推动力。汽车租赁业为道路运输车辆一种新的融资服务形式、广大人民群众一种新的出行消费方式和…

Centos7 配置Docker镜像加速器

docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升…

区块链中slot、epoch、以及在slot和epoch中的出块机制,分叉原理(自己备用)

以太坊2.0中有两个时间概念&#xff1a;时隙槽slot 和 时段&#xff08;周期&#xff09;epoch。其中一个slot为12秒&#xff0c;而每个 epoch 由 32 个 slots 组成&#xff0c;所以每个epoch共384秒&#xff0c;也就是 6.4 分钟。 对于每个epoch&#xff0c;使用RANDAO伪随机…

Unity小项目__打砖块

//1.添加地面 1&#xff09;创建一个平面&#xff0c;命名为Ground。 2)创建一个Materials文件夹&#xff0c;并在其中创建一个Ground材质&#xff0c;左键拖动其赋给平面Plane。 3)根据喜好设置Ground材质和Ground平面的属性。 // 2.创建墙体 1&#xff09;创建一个Cube&…

基于Simulink的Chaos混沌电路设计与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 07_001m 4.算法理论概述 混沌电路是一类特殊的非线性电路&#xff0c;其输出信号表现出无规律…

数字后端笔试题(1)DCG后congestion问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 已知某模块的DCG结果显示存在congestion&#xff0c;有congestion部分逻辑结构如下图: 问题1: 如何分析该电路有congestion问题的原因&#xff1f; 答&#xff1a;data selecti…

基于STM32+FreeRTOS的四轴机械臂

目录 项目概述&#xff1a; 一 准备阶段&#xff08;都是些废话&#xff09; 二 裸机测试功能 1.摇杆控制 接线&#xff1a; CubeMX配置&#xff1a; 代码&#xff1a; 2.蓝牙控制 接线&#xff1a; CubeMX配置 代码&#xff1a; 3.示教器控制 4.记录动作信息 5.执…