驱动开发--多路复用-信号

这篇具有很好参考价值的文章主要介绍了驱动开发--多路复用-信号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、多路复用

 每个进程都有一个描述符数组,这个数组的下标为描述符,

描述符的分类:

  1. 文件描述符:设备文件、管道文件

  2. socket描述符

1.1 应用层:三套接口select、poll、epoll

select:位运算实现 监控的描述符数量有限(32位机1024,64位机2048) 效率差

poll:链表实现,监控的描述符数量不限 效率差

epoll:效率最高,监控的描述符数量不限

select文章来源地址https://www.toymoban.com/news/detail-814889.html

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
/*  功能:监听多个描述符,阻塞等待有一个或者多个文件描述符,准备就绪。
        内核将没有准备就绪的文件描述符,从集合中清掉了。
    参数:  nfds           最大文件描述符数 ,加1
            readfds     读文件描述符集合
            writefds        写文件描述符集合
            exceptfds       其他异常的文件描述符集合
            timeout     超时时间(NULL)
    返回值:当timeout为NULL时返回0,成功:准备好的文件描述的个数  出错:-1 
           当timeout不为NULL时,如超时设置为0,则select为非阻塞,超时设置 > 0,则无描述符可被操作的情况下阻塞指定长度的时间 
*/
void FD_CLR(int fd, fd_set *set);
//功能:将fd 从集合中清除掉
​
int  FD_ISSET(int fd, fd_set *set);
//功能:判断fd 是否存在于集合中
 
void FD_SET(int fd, fd_set *set);
//功能:将fd 添加到集合中
​
void FD_ZERO(fd_set *set);
//功能:将集合清零
​
//使用模型:
​
while(1)
{
    /*得到最大的描述符maxfd*/
    /*FD_ZERO清空描述符集合*/
    /*将被监控描述符加到相应集合rfds里  FD_SET*/
    /*设置超时*/
    ret = select(maxfd+1,&rfds,&wfds,NULL,NULL);
    if(ret < 0)
    {
        if(errno == EINTR)//错误时信号引起的
        {
            continue;   
        }
        else
        {
            break;
        }
    }
    else if(ret == 0)
    {//超时
        //.....
    }
    else
    { //> 0 ret为可被操作的描述符个数
        if(FD_ISSET(fd1,&rfds))
        {//读数据
            //....
        }
        if(FD_ISSET(fd2,&rfds))
        {//读数据
            //....
        }
        ///.....
        if(FD_ISSET(fd1,&wfds))
        {//写数据
            //....
        }
    }
}
   

1.2 驱动层:实现poll函数

void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p);
/*功能:将等待队列头添加至poll_table表中
  参数:struct file :设备文件
  Wait_queue_head_t :等待队列头
  Poll_table :poll_table表
*/
​
/*该函数与select、poll、epoll_wait函数相对应,协助这些多路监控函数判断本设备是否有数据可读写*/
unsigned int xxx_poll(struct file *filp, poll_table *wait) //函数名初始化给struct file_operations的成员.poll
{
    unsigned int mask = 0;
    /*
        1. 将所有等待队列头加入poll_table表中
        2. 判断是否可读,如可读则mask |= POLLIN | POLLRDNORM;
        3. 判断是否可写,如可写则mask |= POLLOUT | POLLWRNORM;
    */
    
    return mask;
}

二、信号驱动

2.1 应用层:信号注册+fcntl

signal(SIGIO, input_handler); //注册信号处理函数
​
fcntl(fd, F_SETOWN, getpid());//将描述符设置给对应进程,好由描述符获知PID
​
oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, oflags | FASYNC);//将该设备的IO模式设置成信号驱动模式
​
void input_handler(int signum)//应用自己实现的信号处理函数,在此函数中完成读写
{
    //读数据
}
​
//应用模板
int main()
{
    int fd = open("/dev/xxxx",O_RDONLY);
​
    fcntl(fd, F_SETOWN, getpid());
​
    oflags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, oflags | FASYNC);
​
    signal(SIGIO,xxxx_handler);
​
    //......
}
    
void xxxx_handle(int signo)
{//读写数据
    
}
​
​

2.2 驱动层:实现fasync函数

/*设备结构中添加如下成员*/
struct fasync_struct *pasync_obj;
​
/*应用调用fcntl设置FASYNC时调用该函数产生异步通知结构对象,并将其地址设置到设备结构成员中*/
static int hello_fasync(int fd, struct file *filp, int mode) //函数名初始化给struct file_operations的成员.fasync
{
    struct hello_device *dev = filp->private_data; 
    return fasync_helper(fd, filp, mode, &dev->pasync_obj);
}
​
/*写函数中有数据可读时向应用层发信号*/
if (dev->pasync_obj)
       kill_fasync(&dev->pasync_obj, SIGIO, POLL_IN);
       
/*release函数中释放异步通知结构对象*/
if (dev->pasync_obj) 
    fasync_helper(-1, filp, 0, &dev->pasync_obj);
​
int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **pp);
/*
    功能:产生或释放异步通知结构对象
    参数:
    返回值:成功为>=0,失败负数
*/
​
void kill_fasync(struct fasync_struct **, int, int);
/*  
    功能:发信号
    参数:
        struct fasync_struct ** 指向保存异步通知结构地址的指针
        int     信号 SIGIO/SIGKILL/SIGCHLD/SIGCONT/SIGSTOP
        int     读写信息POLLIN、POLLOUT
*/

到了这里,关于驱动开发--多路复用-信号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (二十一)大数据实战——Flume数据采集之复制和多路复用案例实战

    本节内容我们完成Flume数据采集的一个多路复用案例,使用三台服务器,一台服务器负责采集本地日志数据,通过使用Replicating ChannelSelector选择器,将采集到的数据分发到另外俩台服务器,一台服务器将数据存储到hdfs,另外一台服务器将数据存储在本机,使用Avro的方式完成

    2024年02月09日
    浏览(47)
  • 计算机网络_ 1.3 网络核心(数据交换_电路交换_多路复用)

    多路复用(Multiplexing),简称复用,是通信技术的基本概念。 链路/网络资源(如带宽)划分为“资源片” 将资源片分配给各路“呼叫”(calls) 每路呼叫 独占 分配到的资源片进行通信 资源片可能“闲置”(idle) (无共享) 典型多路复用方法 频分多路复用( frequency division mult

    2024年02月12日
    浏览(48)
  • Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130381428 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…   mysql驱动版本msvc2015x32版本调

    2023年04月26日
    浏览(78)
  • 网络通信基础 - 多路复用技术(频分多路复用、时分多路复用、波分多路复用)

    多路复用技术:把多个低速信道组合成一个高速信道的技术 这种技术要用到两个设备,统称为 多路器(MUX) 多路复用器(Multiplexer) :在发送端根据某种约定的规则把多个低带宽的信号复合成一个高带宽的信号 多路分配器(Demultiplexer) :在接收端根据同一规则把高带宽信

    2023年04月23日
    浏览(43)
  • Flume多路复用模式把接收数据注入kafka 的同时,将数据备份到HDFS目录

    启动hadoop、在hdfs中创建需要访问的目录 配置Hadoop的核心配置文件 core-site.xml :设置Hadoop的核心配置参数,例如NameNode的地址、数据块大小、副本数量等。示例配置如下: hdfs-site.xml :设置HDFS(Hadoop分布式文件系统)的参数,例如数据块复制因子、NameNode的存储路径等。示例配

    2024年02月16日
    浏览(43)
  • 数据库驱动链接

    数据库驱动链接 MySQL数据库:     1)驱动包:https://mvnrepository.com/artifact/mysql/mysql-connector-java(下载路径)     2)驱动类名:com.mysql.jdbc.Driver     3)JDBC的URL:jdbc:mysql://IP地址:端口号/数据库名字      注:端口号缺省为:3306      SQL server2005数据库:     1)驱动包:

    2024年02月05日
    浏览(37)
  • IDEA下载数据库驱动失败解决办法

    在使用IDEA连接数据库的时候可能会出现驱动下载失败的情况。我们可以到数据库官网上下载驱动进行本地安装。 下面以Sql Server为例: 官网地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 到页面底部找到驱动(连接器) 点击【Microsoft JDBC Driver for SQL Server】,会打开新

    2024年02月06日
    浏览(44)
  • 配置ODBC驱动连接DM8数据库

    ODBC提供访问不同类型的数据库的途径。结构化查询语言 SQL 是一种用来访问数据库的语言。通过使用 ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。这使得开发者不需要以特殊的数据库管理系统 DBMS 为目标,或者了解不同支撑背景的数据库的详细细节,就能

    2024年02月16日
    浏览(48)
  • 云原生 DaaS 服务:实现数据驱动的创新和价值(数据库、缓存、大数据等)

    随着数据在现代企业中的地位不断提升,数据管理和分析成为了业务成功的关键。在这个信息爆炸的时代,如何高效地管理、处理和分析海量数据成为了每个数据企业面临的重要挑战。为了应对这一挑战,云原生数据即服务(DaaS)应运而生,为企业提供了一种全新的数据管理

    2024年04月15日
    浏览(34)
  • ASP.NET之 用Mysql驱动连接数据库

    前言:上一节已经用VisualStudio2019成功创建和运行了ASP项目( https://mp.csdn.net/mp_blog/creation/editor/129413215 ),下面将进行数据库的连接 一,下载驱动库,根JSP一样需要一个Mysql驱动包来支持.NET语言。官网下载链接: https://www.mysql.com/products/connector/   二,安装驱动包  选择自定义

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包