系統呼叫pipe

2021-09-23 15:31:38 字數 1333 閱讀 1249

函式原型:

int pipe(int file_descriptor[2])

引數:

file_descriptor[2]:兩個元素的整數陣列

返回值:

成功:  返回0,並通過值file_descriptor[2]傳出兩個檔案描述符號;

file_descriptor[0] :  通過此檔案描述法從從管道讀出資料

file_descriptor[1] : 通過此檔案描述符向管道寫資料

note :(1)寫程序------file_descriptor[1]   ---->   pipe   -------file_descriptor[0]------>讀程序;若反過來讀寫,則可能發生未知錯誤。

資料進出管道順序fifo

(2)若關閉pipe的寫入一端,則對於讀取程序,read不會阻塞於等待資料,而是直接返回0

(3) fork呼叫中file_descriptor[2]有兩份,欲關閉管道,必須將二者均關閉

e.g.1   通過fork呼叫建立子程序,並通過pipe在父子程序之間通訊

#include #include #include #include #define num 30

int main()

else if(pid==0)

else

} return 0;

}

e.g.2  通過execl呼叫建立新程序,並通過pipe在兩個程序之間通訊

2、pipe作用於檔案描述符0,1

首先會使用到這兩個函式

dup函式原型: int dup(int file_descriptor)

引數: file_descriptor,檔案描述符

返回值: 返回與file_descriptor指向相同檔案的最小可用檔案描述符

dup2函式原型:   int dup2(int file_descriptor_one,int file_descriptor_two)

類似於dup,但是其第二個引數指明想要建立file_descriptor_two來重複指向file_descriptor指向的檔案,若file_descriptor_two被                     占用,則返回第乙個大於file_descriptor_two且未被占用的值

note:

(1)、現在可以通過, close(0)  ;dup(file[0]),此時均可從0和file[0]讀出管道中的資料,由於0又是標準輸入,則可以直接使用從標準輸入讀               資料的函式,而此時,事實上,這些函式處理的是從管道輸出的資料。

(2)、close(1),dup(file[1])與上述是同乙個道理。

怎樣使用spark的pipe呼叫外部程式

spark在rdd上提供pipe 方法。spark的pipe 方法可以讓我們使用任意一種語言實現spark作業中的部分邏輯,只要它能讀寫unix標準的流就行。通過pipe 你可以將rdd中的各元素從標準輸入流中以字串形式讀出,並對這些元素執行任何你需要的操作,然後把結果以字串的形式寫入標準輸出 這個...

read系統呼叫,mmap系統呼叫

read系統呼叫,mmap系統呼叫 2012 07 23 09 54 28 分類 linux 標籤 linux 檔案系統 虛擬記憶體 儲存系統 字型大小 訂閱 一般情況下,操作檔案既可以使用標準i o,也可直接使用系統呼叫。兩者有何區別呢?在輸入輸出中,直接使用底層的系統呼叫效率是非常低的,為什麼?...

linux系統程式設計 程序間通訊 pipe

程序間通訊 pipe 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproce...