首頁 運維 linux運維 linux管道是什麼

linux管道是什麼

Jan 31, 2023 pm 07:23 PM
linux 管道

在linux中,管道是一種通訊機制,是把一個程式的輸出直接連接到另一個程式的輸入。從本質上來說,管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題,具體表現為:限制管道的大小、讀取進程可能工作得比寫進程快。

linux管道是什麼

本教學操作環境:linux7.3系統、Dell G3電腦。

管道是Linux中很重要的一種通訊方式,是把一個程式的輸出直接連接到另一個程式的輸入。常說的管道多是指無名管道,無名管道只能用於具有親緣關係的進程之間,這是它與有名管道的最大區別。

有名管道叫named pipe或FIFO(先進先出),可以用函數mkfifo()來建立。

Linux管道的實作機制

在Linux中,管道是一種使用非常頻繁的通訊機制。從本質上來說,管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題,具體表現為:

  • 限制管道的大小。實際上,管道是一個固定大小的緩衝區。在Linux中,該緩衝區的大小為1頁,即4K字節,使得它的大小不像檔案那樣不加檢驗地增長。使用單一固定緩衝區也會帶來問題,例如在寫入管道時可能變滿,當這種情況發生時,隨後對管道的write()呼叫將預設被阻塞,等待某些資料被讀取,以便騰出足夠的空間供write()調用寫。

  • 讀取進程也可能運作得比寫入進程快。當所有目前進程資料已被讀取時,管道變空。當這種情況發生時,一個隨後的read()呼叫將預設被阻塞,等待某些資料被寫入,這解決了read()呼叫返回檔案結束的問題。

注意:從管道讀取資料是一次性操作,資料一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的資料。

1. 管道的結構

     在 Linux 中,管道的實作並沒有使用專門的資料結構,而是藉助了檔案系統的file結構和VFS的索引節點inode。透過將兩個 file 結構指向同一個臨時的 VFS 索引節點,而這個 VFS 索引節點又指向一個實體頁面而實現的。

2.管道的讀寫

      管道實現的原始程式碼在fs/pipe.c中,在pipe.c中有很多函數,其中有兩個函數比較重要,即管道讀取函數pipe_read()和管道寫函數pipe_wrtie()。管道寫函數透過將位元組複製到 VFS 索引節點指向的物理記憶體而寫入數據,而管道讀取函數則透過複製物理記憶體中的位元組而讀出數據。當然,核心必須利用一定的機制同步對管道的訪問,為此,核心使用了鎖、等待佇列和訊號。

     在寫入進程寫入管道中時,它利用標準的函式庫函數write(),系統依據函式庫函數傳遞的檔案描述符,找到該檔案的 file 結構。 file 結構中指定了用來進行寫入操作的函數(即寫入函數)位址,於是,核心呼叫該函數完成寫入操作。寫入函數在寫入資料到記憶體之前,必須先檢查 VFS 索引節點中的信息,同時滿足下列條件時,才能進行實際的記憶體複製工作:

  • 記憶體中有足夠的空間可容納所有要寫入的資料;

  • 記憶體沒有被讀取程式鎖定。

如果同時滿足上述條件,寫入函數首先鎖定內存,然後從寫入進程的位址空間複製資料到記憶體。否則,寫入進程就休眠在 VFS 索 引節點的等待佇列中,接下來,核心將呼叫調度程序,而調度程式會選擇其他進程運行。寫入進程實際上處於可中斷的等待狀態,當記憶體中有足夠的空間可以容納寫入 數據,或記憶體被解鎖時,讀取進程會喚醒寫入進程,這時,寫入進程將接收到訊號。當資料寫入記憶體之後,記憶體被解鎖,而所有休眠在索引節點的讀取進程會被喚 醒。

管 道的讀取過程和寫入過程類似。但是,進程可以在沒有資料或記憶體被鎖定時立即傳回錯誤訊息,而不是阻塞該進程,這依賴於檔案或管道的開啟模式。反之,進程可 以休眠在索引節點的等待佇列中等待寫入進程寫入資料。當所有的進程完成了管道操作之後,管道的索引節點被丟棄,而共享資料頁也被釋放。

因為管道的實現涉及很多文件的操作,因此,當讀者學完有關文件系統的內容後來讀pipe.c中的代碼,你會覺得並不難理解。

Linux 管道的建立和使用都要簡單一些,唯一的原因是它需要更少的參數。實現與Windows 相同的管道建立目標,Linux 和UNIX 使用下面的程式碼片段:

建立Linux 命名管道

int fd1[2];
if(pipe(fd1))
{
 printf("pipe() FAILED: errno=%d",errno);
 return 1;
}
登入後複製

Linux 管道對阻塞之前一次寫入操作的大小有限制。專為每個管道所使用的核心級緩衝區確切為 4096 位元組。除非閱讀器清空管道,否則一次超過 4K 的寫入操作將被阻塞。實際上這算不上什麼限制,因為讀取和寫入操作是在不同的執行緒實現的。

Linux 也支援命名管道。對這些數字的早期評論者建議我,為公平起見,應該比較 Linux 的命名管道和 Windows 的命名管道。我寫了另一個在 Linux 上使用命名管道的程式。我發現對於 Linux 上命名的和未命名的管道,結果是沒有區別。

Linux 管道比 Windows 2000 命名管道快很多,而 Windows 2000 命名管道比 Windows XP 命名管道快得多。

範例:

#include<stdio.h>
#include<unistd.h>


int main()
{
int n,fd[2];                         // 这里的fd是文件描述符的数组,用于创建管道做准备的
pid_t pid;
char line[100];
if(pipe(fd)<0)                     //   创建管道
   printf("pipe create error/n");

if((pid=fork())<0)              //利用fork()创建新进程
    printf("fork error/n");

else if(pid>0){                   //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"
    close(fd[0]);
    write(fd[1],"hello word/n",11);
}
else{
    close(fd[1]);                 //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据
   n= read(fd[0],line,100);
    write(STDOUT_FILENO,line,n);
}
exit(0);
}
登入後複製

推薦學習:Linux影片教學

以上是linux管道是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

vscode 可以用於 mac 嗎 vscode 可以用於 mac 嗎 Apr 15, 2025 pm 07:36 PM

VS Code 可以在 Mac 上使用。它具有強大的擴展功能、Git 集成、終端和調試器,同時還提供了豐富的設置選項。但是,對於特別大型項目或專業性較強的開發,VS Code 可能會有性能或功能限制。

See all articles