• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-162  評論-223  文章-30  trackbacks-0
               眾所周知,TLS是指線程局部存儲,FIFO是Unix中的命名管道,可用于無關進程間的通信,而本文描述的TLS FIFO是指這樣一種機制:如果一個線程在每次IO操作時,若沒有連接,則先連接到FIFO服務端,再將連接關聯到這個線程的TLS中,這里的連接即創建并打開唯一的FIFO,之后的讀寫就在這個FIFO連接上進行;當FIFO連接斷開時,在下次IO操作時會自動重連。這樣一來,用戶程序就只要調用相關的IO操作,而不必管理連接,極大地簡化了程序。使用FIFO通信前先要創建FIFO再打開它,其中創建是最重要的操作,結果有3種情況:成功、失敗和已存在。

            結構定義
            typedef struct 
            {
                int fd;
                char *name;
            }ipc_fifo_t;
              fd存儲FIFO文件描述符,name存儲FIFO文件系統路徑名。

            接口函數
               創建FIFO
            ipc_fifo_t* ipc_fifo_make(const char *path,mode_t mode);
              path指定FIFO路徑,可以是絕對路徑或相對路徑,mode指定訪問權限,若成功則返回一個FIFO結構,否則為NULL;通常被ipc_fifo_open調用。
               
               打開FIFO
            int ipc_fifo_open(ipc_fifo_t **f,const char *path,int flag,mode_t mode);
              flag指定打開標志,如果包含了O_CREAT標志,那么調用ipc_fifo_make創建新的FIFO對象并在打開成功后替換*f,否則如果*f為空,就分配并初始化一個fifo結構;mode指定訪問權限,僅當創建時生效。雖然f為輸入輸出參數,但操作失敗時不會影響它,也就是說沒有副作用。

              ● 發送數據   
            ssize_t ipc_fifo_write(ipc_fifo_t *f,const void *data,size_t size);
              如果成功則返回已發送的字節數,否則返回-1,errno表示出錯代碼。
               
              ● 接收數據
            ssize_t ipc_fifo_read(ipc_fifo_t *f,void *data,size_t size);
              如果成功則返回已發送的字節數,否則返回-1,errno表示出錯代碼。

              ● 關閉FIFO
            void ipc_fifo_close(ipc_fifo_t *f);
              當通信結束的時候,應該調用此函數來關閉FIFO,它會先刪除FIFO文件和關閉文件描述符,最后釋放fifo結構。

              ● 獲取TLS FIFO
            ipc_fifo_t* ipc_fifo_tls_get();
              該函數一般被發送數據接口調用,若成功則返回一個FIFO結構,否則為NULL;每個線程對應一個FIFO對象,對于同一線程,獲取的是同一個FIFO對象,而后便可調用ipc_fifo_write來發送數據。

            工作流程
              創建FIFO
              適用于FIFO客戶端和服務端,但服務端由于要異步處理眾多FIFO客戶端,因此要注意以下2個問題,這也是使用FIFO技術通信的一些細節。
              1)必須以非阻塞讀寫方式打開知名FIFO,即以O_CREAT|O_RDWR|O_NONBLOCK標志來調用ipc_fifo_open,這樣才不會阻塞等待某個客戶端以同步寫方式打開知名FIFO而返回,因為它使用O_RDWR標志,這樣自己既讀又寫,加上O_NONBLOCK,就立即返回了。
              2)必須以非阻塞只讀方式打開對應客戶端FIFO,即以O_RDONLY|O_NONBLOCK標志調用ipc_fifo_open,這樣就不會阻塞接受客戶端建立連接而返回。

              建立FIFO連接
              適用于FIFO客戶端,被發送數據接口調用,考慮到服務端可能事先沒有打開知名FIFO來監聽連接,所以這里先以異步方式寫打開知名FIFO如果成功則改以阻塞方式發送唯一路徑名到服務端,如果發送完全后,接著以同步方式寫打開唯一FIFO,這是為了等待服務端打開了對應的唯一FIFO。

              發送數據

              適用于FIFO客戶端,當TLS中沒有關聯對應的FIFO時,則先調用fifo_tls_get進入建立FIFO連接流程,而后再發數據。
            posted on 2014-12-01 00:13 春秋十二月 閱讀(1361) 評論(2)  編輯 收藏 引用 所屬分類: System

            評論:
            # re: 基于TLS FIFO的進程間通信模型[未登錄] 2014-12-24 18:00 | jiuyueshouyi
            這是在FIFO之上再利用TLS做一層封裝使得每個線程都使用獨立的FIFO嗎?或者說是TLS的一種應用?  回復  更多評論
              
            # re: 基于TLS FIFO的進程間通信模型[未登錄] 2014-12-24 19:57 | 春秋十二月
            @jiuyueshouyi
            都算是吧  回復  更多評論
              
            亚洲国产精品狼友中文久久久| 久久不见久久见免费视频7| 日本精品久久久久中文字幕8| 国内精品久久久久影院日本| 国产精品成人无码久久久久久| 久久久午夜精品福利内容| 久久精品国产亚洲av麻豆小说 | 久久国产高清字幕中文| 久久精品国产亚洲一区二区三区| 亚洲αv久久久噜噜噜噜噜| 久久99久久成人免费播放| 久久影院综合精品| 国产69精品久久久久观看软件 | 亚洲另类欧美综合久久图片区| 午夜久久久久久禁播电影| 一级做a爱片久久毛片| 久久久无码一区二区三区| 无码精品久久一区二区三区| 九九精品99久久久香蕉| 久久天天躁夜夜躁狠狠躁2022| 久久精品国产免费| AV无码久久久久不卡蜜桃| 亚洲色欲久久久综合网东京热 | 精品久久人人爽天天玩人人妻| 久久国产精品免费一区二区三区| 久久精品国产亚洲AV麻豆网站| 久久综合精品国产一区二区三区| 9191精品国产免费久久| www.久久热| 一级做a爱片久久毛片| 99久久人妻无码精品系列| 久久超碰97人人做人人爱| 久久国产欧美日韩精品| 无码超乳爆乳中文字幕久久| 天天躁日日躁狠狠久久| 久久综合噜噜激激的五月天| 久久综合给合久久国产免费 | 国产成人精品久久二区二区| av无码久久久久不卡免费网站| 国产精品久久国产精麻豆99网站| 97久久天天综合色天天综合色hd|