亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程間通信之FIFO

2024-06-28 13:27:54
字體:
來源:轉載
供稿:網友
進程間通信之FIFO

FIFO有時被稱為命名管道。管道只能由相關進程使用,這些相關進程的共同祖先進程創建了管道。但是,通過FIFO,不相關的進程也能交換數據

FIFO是一種文件類型(參考http://www.CUOXin.com/nufangrensheng/p/3501533.html)。stat結構(http://www.CUOXin.com/nufangrensheng/p/3501385.html)成員st_mode的編碼指明文件是否是FIFO類型??梢杂肧_ISFIFO()宏對此進行測試。

創建FIFO類似于創建文件。確實,FIFO的路徑名存在于文件系統中。

#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);返回值:若成功則返回0,若出錯則返回-1

mkfifo函數中mode參數的規格說明與open函數中的mode相同(見http://www.CUOXin.com/nufangrensheng/p/3497789.html,具體的mode取值見http://www.CUOXin.com/nufangrensheng/p/3505129.html)。新FIFO的用戶和組的所有權規則與http://www.CUOXin.com/nufangrensheng/p/3502133.html中所述的相同。

一旦已經用mkfifo創建了一個FIFO,就可用open打開它。其實,一般的文件I/O函數(close、read、write、unlink等)都可用于FIFO。

應用程序可以用mknod函數創建FIFO。POSIX.1原先并沒有包括mknod函數,它首先提出了mkfifo。mknod現在已包括在XSI擴展中。在大多數系統中,mkfifo調用mknod創建FIFO。

POSIX.1也包括了對mkfifo(1)命令的支持。于是,用一條shell命令就可以創建一個FIFO,然后用一般的shell I/O重定向對其進行訪問。

當打開一個FIFO時,非阻塞標志(O_NONBLOCK)產生下列影響:

  • 在一般情況中(沒有指定O_NONBLOCK),只讀open要阻塞到某個其他進程為寫而打開此FIFO。類似地,只寫open要阻塞到某個其他進程為讀而打開它。
  • 如果指定了O_NONBLOCK,則只讀open立即返回。但是,如果沒有進程已經為讀而打開一個FIFO,那么只寫open將出錯返回-1,其errno是ENXIO。

類似于管道,若用write寫一個尚無進程為讀而打開的FIFO,則產生信號SIGPipE。若某個FIFO的最后一個寫進程關閉了該FIFO,則將為該FIFO的讀進程產生一個文件結束標志。

一個給定的FIFO有多個寫進程是很常見的。這就意味著如果不希望多個進程所寫的數據互相穿插,則需考慮原子寫操作。正如對于管道一樣,常量PIPE_BUF說明了可被原子地寫到FIFO的最大數據量。

FIFO有下面兩種用途:

(1)FIFO由shell命令使用以便將數據從一條管道線傳送到另一條,為此無需創建中間臨時文件。

(2)FIFO用于客戶進程-服務器進程應用程序中,以在客戶進程和服務器進程之間傳送數據。

我們各用一個例子來說明這兩種用途。

實例:用FIFO復制輸出流

FIFO可被用于復制串行管道命令之間的輸出流,于是也就不需要寫數據到中間磁盤文件中(類似于使用管道以避免中間磁盤文件)。管道只能用于進程間的線性連接,然而,因為FIFO具有名字,所以它可用于非線性連接。

考慮這樣一個操作過程,它需要對一個經過過濾的輸入流進行兩次處理。圖15-9表示了這種安排。

未命名

圖15-9 對一個經過過濾的輸入流進行兩次處理

使用FIFO以及UNIX系統程序tee(1),就可以實現這樣的過程而無需使用臨時文件。(tee程序將其標準輸入同時復制到其標準輸出以及其命令行中包含的命名文件中。)

mkfifo fifo1PRog3 < fifo1 &prog1 < infile | tee fifo1 | prog2

我們創建FIFO,然后在后臺啟動prog3,它從FIFO讀數據。然后啟動prog1,用tee將其輸出發送到FIFO和prog2。圖15-10顯示了這種安排。

未命名

            圖15-10 使用FIFO和tee將一個流發送到兩個進程

實例:客戶進程-服務器進程使用FIFO進行通信

FIFO的另一個應用是在客戶進程和服務器進程之間傳送數據。如果有一個服務器進程,它與很多客戶進程有關,則每個客戶進程都可將其請求寫到一個該服務器進程創建的眾所周知的FIFO中(“眾所周知”的意思是:所有需要與服務器進程聯系的客戶進程都知道該FIFO的路徑名)。圖15-11顯示了這種安排。因為對于該FIFO有多個寫進程,客戶進程發送給服務器進程的請求其長度要小于PIPE_BUF字節。這就能避免客戶多個write之間的交錯(http://www.CUOXin.com/nufangrensheng/p/3560130.html)。

未命名   

     圖15-11 客戶進程用FIFO向服務器進程發送請求  

在這種類型的客戶進程-服務器進程通信中使用FIFO的問題是:服務器進程如何將回答送回各個客戶進程。不能使用單個FIFO,因為服務器進程會發出對各個客戶進程請求的響應,而請求者卻不可能知道什么時候去讀才能恰如其分地讀到對它的響應。一種解決方法是每個客戶進程都在其請求中包含它的進程ID。然后服務器進程為每個客戶進程創建一個FIFO,所使用的路徑名是以客戶進程的進程ID為基礎的。例如,服務器進程可以用名字/tmp/serv1.XXXXX創建FIFO,其中XXXXX被替換成客戶進程的進程ID。圖15-12顯示了這種安排。

未命名

        圖15-12 客戶進程-服務器進程用FIFO進行通信

這種安排可以工作,但也有一些不足之處。其中之一是服務器進程不能判斷一個客戶進程是否崩潰終止,這就使得客戶進程專用的FIFO會遺留在文件系統中。另一個不足之處是服務器進程必須捕捉SIGPIPE信號,因為客戶進程在發送一個請求后沒有讀取響應就可能終止,于是留下一個只有寫進程(服務器進程)而無讀進程的客戶進程專用FIFO。

按照圖15-12中的安排,如果服務器進程以只讀方式打開眾所周知的FIFO(因為它只需讀該FIFO),則每當客戶進程數從1變成0時,服務器進程就將在FIFO中讀到一個文件結束標記。為使服務器進程免于處理這種情況,一種常用的技巧是使服務器進程以讀-寫方式打開其FIFO。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
第一福利永久视频精品| 激情懂色av一区av二区av| 欧美中文字幕视频在线观看| 国产精品久久久久久久久久久久| 欧美日韩福利电影| 最新国产成人av网站网址麻豆| 成人av.网址在线网站| 2021久久精品国产99国产精品| 日韩中文字幕在线视频播放| 亚洲精品97久久| 欧美做爰性生交视频| 国产欧美一区二区三区久久| 亚洲国产精品久久久久| 69影院欧美专区视频| 亚洲欧洲日韩国产| 亚洲一区二区在线播放| 日韩中文字幕av| 久久久久久91| 国产999精品久久久| 久久精品国产一区二区电影| 亚洲欧美日韩国产中文| 尤物九九久久国产精品的特点| 国产精品免费视频xxxx| 欧美在线观看网址综合| 亚洲国产精品99久久| 亚洲护士老师的毛茸茸最新章节| 久久久久久久久电影| 久久精品国产亚洲| 一区二区三区久久精品| 国产欧美精品日韩| 91免费精品视频| 日韩美女毛茸茸| 狠狠躁夜夜躁人人躁婷婷91| 奇米影视亚洲狠狠色| 91免费在线视频| 亚洲欧美一区二区精品久久久| 亚洲人成电影网站| www.xxxx欧美| 欧美性在线观看| 国产精自产拍久久久久久| 欧美国产激情18| 久久人人爽亚洲精品天堂| 国产精品午夜国产小视频| 久操成人在线视频| 久久久精品亚洲| 亚洲国产一区二区三区在线观看| 亚洲精品视频免费在线观看| 国产精品久久久久久久一区探花| 亚洲精品欧美日韩专区| 97视频在线观看网址| 久久99精品国产99久久6尤物| 久久精品国产亚洲精品2020| 国内精品久久久久伊人av| 日韩欧美中文免费| 欧美丝袜一区二区三区| 欧美日韩国产精品一区| 久久亚洲欧美日韩精品专区| 精品视频—区二区三区免费| 久久香蕉国产线看观看网| 国产精品无码专区在线观看| 国产精品一二区| 久久久国产精品x99av| 日韩中文字幕精品| 国产一区二区三区三区在线观看| 欧美在线观看网站| 欧美在线一区二区视频| 国外成人性视频| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品久久久久久久午夜| 久久69精品久久久久久久电影好| 在线观看日韩专区| 91国偷自产一区二区三区的观看方式| 久久成人亚洲精品| 日韩精品中文字幕视频在线| 色综合91久久精品中文字幕| 亚洲xxxxx电影| 一本色道久久88精品综合| 精品网站999www| 精品美女久久久久久免费| 国产精品偷伦视频免费观看国产| 91免费看视频.| 亚洲国产欧美久久| 久久精品中文字幕电影| 亚洲国产精品悠悠久久琪琪| 欧美日韩国产影院| 欧美成人在线网站| 日韩亚洲精品视频| 夜夜嗨av色一区二区不卡| 日韩精品在线电影| 欧美野外wwwxxx| 日韩女优在线播放| 这里只有精品在线观看| 欧美肥臀大乳一区二区免费视频| 国产亚洲精品成人av久久ww| 最新国产成人av网站网址麻豆| 丝袜美腿亚洲一区二区| 亚洲欧美制服另类日韩| 日韩av手机在线观看| 日韩中文字幕在线观看| 97精品视频在线观看| 欧美亚洲另类在线| 亚洲最大福利网站| 91免费版网站入口| 亚洲一区二区三区乱码aⅴ| 欧美夫妻性生活xx| 91精品国产91久久| 色偷偷av亚洲男人的天堂| 国产精品久久婷婷六月丁香| 欧美精品18videosex性欧美| 国产精品久久久久av| 久久久久久久97| 国产在线播放不卡| 国产一区二区三区久久精品| 91在线高清视频| 精品久久中文字幕| 欧美午夜性色大片在线观看| 欧美精品videofree1080p| 成人激情视频网| 日本欧美在线视频| 亚洲欧美日韩视频一区| 精品亚洲一区二区三区四区五区| 成人淫片在线看| 欧美视频一二三| 国产精品视频网| 国产美女精品视频免费观看| 日韩av免费在线播放| 日韩亚洲欧美中文在线| 91精品国产精品| 98视频在线噜噜噜国产| 色七七影院综合| 久久久精品国产一区二区| 一区二区三区动漫| 亚洲a在线观看| 成人在线视频网| 国产成人一区二区三区| 亚洲国产成人精品一区二区| 亚洲最大的成人网| 国产91精品黑色丝袜高跟鞋| 国产精品入口尤物| 成人精品久久久| 亚洲精品久久久久国产| 九九视频这里只有精品| 亚洲电影免费在线观看| 欧美日韩日本国产| 亚洲第一页在线| 国产xxx69麻豆国语对白| 69视频在线播放| 在线观看欧美成人| 国产精品手机播放| 欧美电影免费观看| 亚洲91精品在线观看| 欧美成人午夜激情视频| 国产视频精品xxxx| 色噜噜狠狠狠综合曰曰曰88av| 欧美日韩国产精品一区| 国产成人高清激情视频在线观看| 亚洲综合在线播放| 九九视频这里只有精品| 久久精品国产成人| 成人黄在线观看| 国产精品久久久久久婷婷天堂| 8050国产精品久久久久久| 久久国产精品亚洲| 日韩欧美aⅴ综合网站发布|