為什麼應該在 Linux 上使用命名管道
命名管道並不常用,但是它們為程式間通訊提供了一些有趣的特性。
估計每一位 Linux 使用者都熟悉使用 “|” 符號將資料從一個程式傳輸到另一個程式的操作。它使使用者能簡便地從一個命令輸出資料到另一個命令,並篩選出想要的資料而無須寫指令碼進行選擇、重新格式化等操作。
還有另一種管道, 雖然也叫“管道”這個名字卻有著非常不同的性質。即您可能尚未使用甚至尚未知曉的——命名管道。
普通管道與命名管道的一個主要區別就是命名管道是以檔案形式實實在在地存在於檔案系統中的,沒錯,它們表現出來就是檔案。但是與其它檔案不同的是,命名管道檔案似乎從來沒有檔案內容。即使使用者往命名管道中寫入大量資料,該檔案看起來還是空的。
如何在 Linux 上建立命名管道
在我們研究這些空空如也的命名管道之前,先追根溯源來看看命名管道是如何被建立的。您應該使用名為 mkfifo
的命令來建立它們。為什麼提及“FIFO”?是因為命名管道也被認為是一種 FIFO 特殊檔案。術語 “FIFO” 指的是它的先進先出特性。如果你將冰淇淋盛放到碟子中,然後可以品嚐它,那麼你執行的就是一個LIFO(後進先出操作。如果你透過吸管喝奶昔,那你就在執行一個 FIFO 操作。好,接下來是一個建立命名管道的例子。
$ mkfifo mypipe
$ ls -l mypipe
prw-r-----. 1 shs staff 0 Jan 31 13:59 mypipe
注意一下特殊的檔案型別標記 “p” 以及該檔案大小為 0。您可以將重定向資料寫入命名管道檔案,而檔案大小依然為 0。
$ echo "Can you read this?" > mypipe
正如上面所說,敲擊回車後似乎什麼都沒有發生(LCTT 譯註:沒有返回命令列提示符)。
另外再開一個終端,檢視該命名管道的大小,依舊是 0:
$ ls -l mypipe
prw-r-----. 1 shs staff 0 Jan 31 13:59 mypipe
也許這有違直覺,使用者輸入的文字已經進入該命名管道,而你仍然卡在輸入端。你或者其他人應該等在輸出端,並準備讀取放入管道的資料。現在讓我們讀取看看。
$ cat mypipe
Can you read this?
一旦被讀取之後,管道中的內容就沒有了。
另一種研究命名管道如何工作的方式是透過將放入資料的操作置入後臺來執行兩個操作(將資料放入管道,而在另外一段讀取它)。
$ echo "Can you read this?" > mypipe &
[1] 79302
$ cat mypipe
Can you read this?
[1]+ Done echo "Can you read this?" > mypipe
一旦管道被讀取或“耗幹”,該管道就清空了,儘管我們還能看見它並再次使用。可為什麼要費此周折呢?
為何要使用命名管道?
命名管道很少被使用的理由似乎很充分。畢竟在 Unix 系統上,總有多種不同的方式完成同樣的操作。有多種方式寫檔案、讀檔案、清空檔案,儘管命名管道比它們來得更高效。
值得注意的是,命名管道的內容駐留在記憶體中而不是被寫到硬碟上。資料內容只有在輸入輸出端都開啟時才會傳送。使用者可以在管道的輸出端開啟之前向管道多次寫入。透過使用命名管道,使用者可以建立一個程式寫入管道並且另外一個程式讀取管道的流程,而不用關心協調二者時間上的同步。
使用者可以建立一個單純等待資料出現在管道輸出端的程式,並在拿到輸出資料後對其進行操作。下列命令我們採用 tail
來等待資料出現。
$ tail -f mypipe
一旦供給管道資料的程式結束了,我們就可以看到一些輸出。
$ tail -f mypipe
Uranus replicated to WCDC7
Saturn replicated to WCDC8
Pluto replicated to WCDC9
Server replication operation completed
如果研究一下向命名管道寫入的程式,使用者也許會驚訝於它的資源消耗之少。在下面的 ps
命令輸出中,唯一顯著的資源消耗是虛擬記憶體(VSZ 那一列)。
ps u -P 80038
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
shs 80038 0.0 0.0 108488 764 pts/4 S 15:25 0:00 -bash
命名管道與 Unix/Linux 系統上更常用的管道相比足以不同到擁有另一個名號,但是“管道”確實能反映出它們如何在程式間傳送資料的形象,故將稱其為“命名管道”還真是恰如其分。也許您在執行操作時就能從這個聰明的 Unix/Linux 特性中獲益匪淺呢。
via: https://www.networkworld.com/article/3251853/linux/why-use-named-pipes-on-linux.html
作者:Sandra Henry-Stocker 譯者:YPBlib 校對:wxy
相關文章
- 在Linux中,什麼是管道操作,以及如何使用它?Linux
- 為什麼不應該在 REST API 中使用布林值? - geekcultureRESTAPI
- [譯]為什麼你應該在相等比較中使用 Object.is()Object
- Linux管道命令是什麼?如何使用?Linux
- Python 集合是什麼,為什麼應該使用以及如何使用?Python
- 為什麼學校應該使用自由軟體
- 為什麼你應該使用一個PHP框架PHP框架
- 轉享:為什麼你應該使用Play框架?框架
- 為什麼我在使用Linux桌面?Linux
- 往linux核心掛鉤子–什麼應該什麼不應該Linux
- 介紹 Linux 中的管道和命名管道Linux
- oracle應該安裝在什麼版本的linux下OracleLinux
- 為什麼程式猿都應該學點linux命令?Linux
- [譯] 為什麼你應該開始使用 KotlinKotlin
- iOS提示框,為什麼你應該使用 MBProgressHUD?iOS
- 為什麼你應該永遠不要再使用MongoDBMongoDB
- 在Linux中,什麼是管道?它是如何工作的?Linux
- 極限程式設計應該在什麼時候使用?程式設計
- [譯] 為什麼你應該停止使用 Git rebase 命令Git
- 為什麼 Python 開發人員應該使用 PipenvPython
- 為什麼每個Android開發者都應該使用AnkoAndroid
- 為什麼開發者應該摒棄敏捷?敏捷
- 為什麼你應該學 Python ?Python
- Linux中的pipe(管道)與named pipe(FIFO 命名管道)Linux
- 應該使用什麼 CI/CD 工具?
- 為什麼你永遠不應該在CSS中使用px來設定字型大小CSS
- windows命名管道Windows
- 什麼情況下不應該使用 Windows Linux 子系統WindowsLinux
- 在Linux中,管道(pipe)和重定向(redirection)的是什麼?Linux
- 為什麼你應該嘗試 “全棧”全棧
- 為什麼你應該嘗試“全棧”全棧
- 為什麼 AI 時代更應該 Learn in PublicAI
- 為什麼你應該為開源做設計
- 在頁面中的應該使用奇數還是偶數的字型?為什麼呢?
- 使用命名管道承載gRPCRPC
- 為什麼你應該學習程式設計程式設計
- 程式設計師為什麼不應該加班程式設計師
- 為什麼微服務應該是事件驅動?微服務事件