作業系統(二):pipe(),程序通訊機制
阿新 • • 發佈:2018-12-16
一、前言
上一節中,我們瞭解了程序的概念,理解了程序的建立機制,尤其是fork函式,也瞭解了程序的三種狀態。今天,我們將瞭解一下程序間的通訊機制。
二、 管道
1、定義
管道:程序間通訊的一種機制。就是將一個程序的輸出作為另一個程序的輸入。C語言中用pipe()函式實現,linux中用 | 實現。
2、例項。
我們這次直接通過一個例子來理解管道pipe()函式。程式碼如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int pfds[2]; if ( pipe(pfds) == 0 ) { if ( fork() == 0 ) { close(1); dup2( pfds[1], 1 ); close( pfds[0] ); execlp( "ls", "ls", "-1", NULL ); } else { close(0); dup2( pfds[0], 0 ); close( pfds[1] ); execlp( "wc", "wc", "-l", NULL ); } } return 0; }
(1)使用pipe函式時,使用一個數組(長度為2)為引數。然後pipe會建立一個管道。然後返回兩個檔案標示符。分別儲存在pfd[0], pfd[1]中。其中pfd[0]是寫資料的一端。pfd[1]是讀資料的一端。最後如果建立管道成功,則返回0,失敗則返回-1. (2)對每一個程序。0,1,2檔案表示符都是固定的,分別表示標準輸入(鍵盤),標準輸出(顯示屏),標準錯誤輸出(也是顯示屏)。因此上方程式碼在建立pipe時,為管道的分配的檔案識別符號為3和4. (3)我們來看程式碼的流程。首先使用pipe穿件了一個管道,並且給管兩個檔案標示符