《Linux程式設計》 程序間通訊 管道

2021-06-26 07:58:33 字數 3673 閱讀 6179

一、管道

2、程序管道

1)、popen函式

#include

file  *popen(const  char  *cpmmand,  const  char  *popen);

i、popen函式允許乙個程式將另乙個程式作為新程序來啟動,並可以傳遞資料給它或者通過它接受資料。command字串是要執行的程式名和相應的函式。popen_mode必

須是「r」或者「w」。

ii、每個popen呼叫都必須指定「r」或「w」,在popen函式的標準實踐中不支援任何其他選項。這意味著我怕們不能呼叫另乙個程式並同時對它進行讀寫操作。popen函式在失敗時

返回乙個空指標。

2)、pclose函式

#include

int  pclose(file  *stream_to_close);

i、用popen啟動的程序結束時,我們可以用pclose函式關閉與之關聯的檔案流。pclose只在popen啟動的程序結束後才返回。如果呼叫pclose時它任然運作,pclose呼叫

將等待該程序的結束。

ii、pclose呼叫的返回值通常是它所關閉的檔案流所在程序的退出碼。如果呼叫程序在呼叫pclose之間執行了乙個wait語句,被呼叫程序的退出狀態就會丟失,因為被呼叫進

程已經結束。此時pclose將返回-1並設定errno為echild。

3、將輸出送往popen(**p445-446)

4、傳遞更多資料(**p446-447)

5、popen函式的實現(**p448)

6、pipe呼叫

#include

int  pipe(int  file_descriptor[2]);

i、此函式在兩個程式之間傳遞資料不需要啟動乙個shell來解釋請求命令。它還提供了對讀寫資料的更多控制。

ii、此函式的引數是乙個由兩個引數型別的檔案描述符組成的陣列的指標。該函式在陣列中填上兩個新的檔案描述符後返回0,如果失敗則返回-1並設定errno來表明錯誤的原

因。兩個返回的檔案描述符以一種特殊的方式連線起來。寫到file_descriptor[1]的所有資料都可以從file_descriptor[0]都出來。資料基於先進先出的原則。

二、父程序與子程序

1、**——資料消費者和資料生產者(p452-453)

2、管道關閉後讀操作

3、把管道用作標準輸入和標準輸出

1)、用管道連線兩個程序更簡潔的方法:把其中乙個管道檔案描述符設定為乙個已知值,一般是標準輸入0或標準輸出1。這樣做我們可以呼叫程式,即那些不需要以檔案描

述 符為引數的程式。

2)、#incldue

int  dup(int  file_descriptor);

int  dup2(int  file_descriptor_one,  int  file_descriptor_two);

i、dup呼叫的目的是開啟乙個新的檔案描述符。它與open呼叫的區別是,dup呼叫建立的新檔案描述符與作為它的引數的那個已有檔案描述符指向同乙個檔案(或管

道)。ii、對於dup2函式來說,新的檔案描述符總是取最小的可用值。而對於dup2來說,它所建立的新檔案描述符或者與引數file_descriptor_two相同。

iii、dup實現在兩個程序傳遞資料的方式:標準輸入的檔案描述符總是0,而dup返回的新的檔案描述符又總是使用最小可用的數字。

三、命名管道:fifo

#include

#include

int  mkfifo(const  char  *filename,  mode_t  mode);

int  mknod(const  char  *filename,  mode_t  mode  |  s_fifo,  (dev_t)  0);

i、與mknod命令一樣,我們可以是mknod函式簡歷許多特殊型別的檔案。要用mknod函式建立乙個可移植的命名管道惟一方法是使用乙個dev_t型別的值0,並將檔案訪問模

式與s_fifo按位與或

1、訪問fifo檔案(p458實驗)

2、使用open開啟fifo檔案

1)、開啟fifo的乙個主要限制是:程式不能以o_rdwr模式開啟fifo檔案進行讀寫操作。通常使用fifo只是為了單向傳遞資料,所以沒有必要使用o_rdwr模式。

2)、開啟fifo檔案和開啟普通檔案的另乙個區別是,對open_flag(open函式的第二個引數)的o_nonblock選項的用法。使用這個選項不僅改變open呼叫處理方式,還

會改變對這次open呼叫返回的檔案描述符進行的讀寫請求的處理方式。

3)、o_rdonly、o_wronly和o_nonblock標誌四種合法的組合方式:

i、open(const  char  *path,  o_rdonly);

在這種情況下,open呼叫劍阻塞,除非有乙個程序以寫方式開啟同乙個fifo,否則它不會返回。

ii、open(const  char  *path,  o_rdonly | o_nonblock);

即使沒有其它程序以寫方式開啟fifo,這個open呼叫也將成功並立刻返回。

iii、open(const  char  *path,  o_wronly);

在這種情況下,open呼叫劍阻塞,除非有乙個程序以讀方式開啟同乙個fifo,否則它不會返回。

iv、open(const  char  *path,  o_wronly | o_nonmlock);

此函式呼叫總是立刻返回,但如果沒有程序以讀方式開啟fifo檔案,open呼叫將返回乙個錯誤-1並且fifo也不會被開啟。如果有乙個程序以讀方式開啟fifo檔案,我

們可以通過它返回的檔案描述符對這個fifo檔案進行寫操作。

4)、不帶o_nonblock標誌的o_rdonly和o_wronly。

5)、帶o_nonblock標誌的o_rdonly和不帶該標識的o_wronly。

6)、對fifo進行讀寫操作

使用o_nonblock模式會影響到對fifo的read和write呼叫:

i、對乙個空的、阻塞的fifo(既沒有用o_nonblock標誌開啟)的read呼叫將等待,直到資料可以讀時才繼續執行。與此相反,對乙個空的非阻塞的fifo的read呼叫將

立刻返回0位元組。

ii、對乙個滿的、阻塞的fifo的write呼叫將等待,直到資料可以被寫入時才繼續執行。如果fifo不能接收所有寫入的資料,它會按下面的規則執行:

*如果請求寫入的資料的長度小於等於pipe_buf位元組,呼叫失敗,資料不能寫入。

*如果請求寫入的資料的長度小於pipe_buf位元組,將寫入部分資料,返回實際寫入的位元組數,返回值也可能是0。

7)、系統對任一時刻在乙個fifo中可以存在到的資料長度是有限制的。它由#define pipe_buf語句定義,通常可以在標頭檔案limit.h中找到。

3、高階主題:使用fifo的客戶/伺服器應用程式(**465-467)

Linux程序間通訊 管道

linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...

Linux程序間通訊 管道

管道 管道是一種最基本的程序間通訊機制,由pipe函式建立 include intpipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,f...

Linux 程序間通訊 管道

程序間通訊 a程序怎樣將 hello world 傳遞給b程序 i 利用檔案實現 需要乙個 中間人 進行傳遞 檔案 在磁碟中儲存 a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下 1.如果a傳送了資料b進行了接收,但a的資料沒有被清空 2.如果a傳送了資料...