Linux管道(無名管道)

2021-10-02 05:09:22 字數 2091 閱讀 5881

是一套免費使用和自由傳播的類unix作業系統,是乙個基於posix和unix的多使用者、多工、支援多執行緒和多cpu的作業系統。它能執行主要的unix工具軟體、應用程式和網路協議。它支援32位和64位硬體。linux繼承了unix以網路為核心的設計思想,是乙個效能穩定的多使用者網路作業系統。它主要用於基於intel x86系列cpu的計算機上。這個系統是由全世界各地的成千上萬的程式設計師設計和實現的。其目的是建立不受任何商品化軟體的版權制約的、全世界都能自由使用的unix相容產品。

管道,分為無名管道和有名管道,是 unix 系統ipc最古老的形式,是程序間通訊的一種

1、無名管道特點:

它是半雙工的(即資料只能在乙個方向上流動),具有固定的讀端和寫端。

它只能用於具有親緣關係的程序之間的通訊(也是父子程序或者兄弟程序之間)。

它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read、write 等函式。但是它不是普通的檔案,並不屬於其他任何檔案系統,並且只存在於記憶體中。

建立無名管道函式和所需標頭檔案

#include

intpipe

(int fd[2]

);

其函式返回值失敗為-1,成功為0

當無名管道建立成功時會建立兩個檔案描述符f[0] 、 f[1],並且建立成功的管道相當於乙個佇列,先進先出,有讀端和寫端

f代表讀端

f代表寫端

在通訊過程中寫端會傳入資料讀端會讀出資料

讀阻塞:如果在管道中沒有資料而執行read時,便會讀阻塞

寫阻塞:如果寫的內容的大小大於管道大小,便會寫阻塞

我們先來看一下在乙個程序裡的實現

在該程序中我們先寫入資料在讀資料,無名管道在讀資料之後管道內入隊的資料就會被出隊(因為管道相當於乙個佇列)

#include

#include

#include

intmain()

else

char write_buff=

"hello world!"

;char read_buff[

128]=;

write

(fd[1]

,write_buff,

sizeof

(write_buff));

read

(fd[0]

,read_buff,

127)

;printf

("%s\n"

,read_buff)

;close

(fd[0]

);close

(fd[1]

);return0;

}

無名管道實現的程序間通訊只能父子程序間通訊

#include

#include

#include

#include

#include

intmain()

else

pid_t pid =

fork()

;assert

(pid!=-1

);if(pid ==-1

)if(pid ==0)

else

;read

(fd[0]

,r_buff,

127)

;printf

("r_buff = %s\n"

,r_buff)

;close

(fd[0]

);}return0;

}

linux管道(無名管道)

首先管道是程序之間的乙個單向資料流,它的資料流向由核心管理,只能從乙個程序流向另外乙個程序,乙個程序向管道寫入資料,另外乙個程序從這個管道讀取資料。在使用管道 無名管道 時,只能用在父子程序或者親屬程序之間,若要用在任意程序之間則需要使用fifo 有名管道 如圖程序ab通過管道進行資料交換。程序a通...

無名管道和有名管道

無名管道 無名管道建立 int pipe int filedis 2 當乙個管道建立時,它會建立兩個檔案描述符 filedis 0 用於讀管道,filedis 1 用於寫管道 管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道 有名管道 有...

管道 無名管道 和FIFO 有名管道

管道是最初的unixipc形式,但是因為管道沒有名字,所以它們只能用於有親緣關係的程序使用 進而有名管道 fifo 應運而生,有名管道有乙個路徑名與之關聯,所以允許無親緣關係的程序訪問同乙個fifo。以下具體介紹管道 管道的建立 管道由函式 int pipe int fd 2 建立,提供乙個單向資料...