国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

驅動開發(fā)--多路復用-信號

這篇具有很好參考價值的文章主要介紹了驅動開發(fā)--多路復用-信號。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、多路復用

?每個進程都有一個描述符數組,這個數組的下標為描述符,

描述符的分類:

  1. 文件描述符:設備文件、管道文件

  2. socket描述符

1.1 應用層:三套接口select、poll、epoll

select:位運算實現 監(jiān)控的描述符數量有限(32位機1024,64位機2048) 效率差

poll:鏈表實現,監(jiān)控的描述符數量不限 效率差

epoll:效率最高,監(jiān)控的描述符數量不限

select文章來源地址http://www.zghlxwxcb.cn/news/detail-814889.html

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
/*  功能:監(jiān)聽多個描述符,阻塞等待有一個或者多個文件描述符,準備就緒。
        內核將沒有準備就緒的文件描述符,從集合中清掉了。
    參數:  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清空描述符集合*/
    /*將被監(jiān)控描述符加到相應集合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函數相對應,協(xié)助這些多路監(jiān)控函數判斷本設備是否有數據可讀寫*/
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);
}
?
/*寫函數中有數據可讀時向應用層發(fā)信號*/
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);
/*  
    功能:發(fā)信號
    參數:
        struct fasync_struct ** 指向保存異步通知結構地址的指針
        int     信號?SIGIO/SIGKILL/SIGCHLD/SIGCONT/SIGSTOP
        int     讀寫信息POLLIN、POLLOUT
*/

到了這里,關于驅動開發(fā)--多路復用-信號的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • (二十一)大數據實戰(zhàn)——Flume數據采集之復制和多路復用案例實戰(zhàn)

    (二十一)大數據實戰(zhàn)——Flume數據采集之復制和多路復用案例實戰(zhàn)

    本節(jié)內容我們完成Flume數據采集的一個多路復用案例,使用三臺服務器,一臺服務器負責采集本地日志數據,通過使用Replicating ChannelSelector選擇器,將采集到的數據分發(fā)到另外倆臺服務器,一臺服務器將數據存儲到hdfs,另外一臺服務器將數據存儲在本機,使用Avro的方式完成

    2024年02月09日
    瀏覽(26)
  • 計算機網絡_ 1.3 網絡核心(數據交換_電路交換_多路復用)

    計算機網絡_ 1.3 網絡核心(數據交換_電路交換_多路復用)

    多路復用(Multiplexing),簡稱復用,是通信技術的基本概念。 鏈路/網絡資源(如帶寬)劃分為“資源片” 將資源片分配給各路“呼叫”(calls) 每路呼叫 獨占 分配到的資源片進行通信 資源片可能“閑置”(idle) (無共享) 典型多路復用方法 頻分多路復用( frequency division mult

    2024年02月12日
    瀏覽(14)
  • Qt+MySql開發(fā)筆記:Qt5.9.3的msvc2017x64版本編譯MySql8.0.16版本驅動并Demo連接數據庫測試

    Qt+MySql開發(fā)筆記:Qt5.9.3的msvc2017x64版本編譯MySql8.0.16版本驅動并Demo連接數據庫測試

    若該文為原創(chuàng)文章,轉載請注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130381428 紅胖子網絡科技博文大全:開發(fā)技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續(xù)更新中… ??mysql驅動版本msvc2015x32版本調

    2023年04月26日
    瀏覽(50)
  • 網絡通信基礎 - 多路復用技術(頻分多路復用、時分多路復用、波分多路復用)

    網絡通信基礎 - 多路復用技術(頻分多路復用、時分多路復用、波分多路復用)

    多路復用技術:把多個低速信道組合成一個高速信道的技術 這種技術要用到兩個設備,統(tǒng)稱為 多路器(MUX) 多路復用器(Multiplexer) :在發(fā)送端根據某種約定的規(guī)則把多個低帶寬的信號復合成一個高帶寬的信號 多路分配器(Demultiplexer) :在接收端根據同一規(guī)則把高帶寬信

    2023年04月23日
    瀏覽(38)
  • Flume多路復用模式把接收數據注入kafka 的同時,將數據備份到HDFS目錄

    Flume多路復用模式把接收數據注入kafka 的同時,將數據備份到HDFS目錄

    啟動hadoop、在hdfs中創(chuàng)建需要訪問的目錄 配置Hadoop的核心配置文件 core-site.xml :設置Hadoop的核心配置參數,例如NameNode的地址、數據塊大小、副本數量等。示例配置如下: hdfs-site.xml :設置HDFS(Hadoop分布式文件系統(tǒng))的參數,例如數據塊復制因子、NameNode的存儲路徑等。示例配

    2024年02月16日
    瀏覽(44)
  • 數據庫驅動鏈接

    數據庫驅動鏈接 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日
    瀏覽(18)
  • IDEA下載數據庫驅動失敗解決辦法

    IDEA下載數據庫驅動失敗解決辦法

    在使用IDEA連接數據庫的時候可能會出現驅動下載失敗的情況。我們可以到數據庫官網上下載驅動進行本地安裝。 下面以Sql Server為例: 官網地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 到頁面底部找到驅動(連接器) 點擊【Microsoft JDBC Driver for SQL Server】,會打開新

    2024年02月06日
    瀏覽(27)
  • 配置ODBC驅動連接DM8數據庫

    配置ODBC驅動連接DM8數據庫

    ODBC提供訪問不同類型的數據庫的途徑。結構化查詢語言 SQL 是一種用來訪問數據庫的語言。通過使用 ODBC,應用程序能夠使用相同的源代碼和各種各樣的數據庫交互。這使得開發(fā)者不需要以特殊的數據庫管理系統(tǒng) DBMS 為目標,或者了解不同支撐背景的數據庫的詳細細節(jié),就能

    2024年02月16日
    瀏覽(27)
  • 云原生 DaaS 服務:實現數據驅動的創(chuàng)新和價值(數據庫、緩存、大數據等)

    云原生 DaaS 服務:實現數據驅動的創(chuàng)新和價值(數據庫、緩存、大數據等)

    隨著數據在現代企業(yè)中的地位不斷提升,數據管理和分析成為了業(yè)務成功的關鍵。在這個信息爆炸的時代,如何高效地管理、處理和分析海量數據成為了每個數據企業(yè)面臨的重要挑戰(zhàn)。為了應對這一挑戰(zhàn),云原生數據即服務(DaaS)應運而生,為企業(yè)提供了一種全新的數據管理

    2024年04月15日
    瀏覽(17)
  • ASP.NET之 用Mysql驅動連接數據庫

    ASP.NET之 用Mysql驅動連接數據庫

    前言:上一節(jié)已經用VisualStudio2019成功創(chuàng)建和運行了ASP項目( https://mp.csdn.net/mp_blog/creation/editor/129413215 ),下面將進行數據庫的連接 一,下載驅動庫,根JSP一樣需要一個Mysql驅動包來支持.NET語言。官網下載鏈接: https://www.mysql.com/products/connector/ ? 二,安裝驅動包? 選擇自定義

    2024年02月02日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包