程序間通訊 管道

2021-08-09 11:37:06 字數 2760 閱讀 6447

程序間通訊:  管道,訊號量,儲存空間,訊息佇列,套接字(socket,網路程式設計)

在我們學習程序間通訊之前,我們在程序之間都是用什麼來進行資料傳遞的?顯而易見,我們使用的是檔案。不過我們的文字檔案一般都是儲存在磁碟中,所以我們在使用時,必須先把資料從磁碟中讀取到記憶體中,然後cpu從記憶體中讀取並做相應的處理。我們自己來感覺,這種方式是不是很浪費時間。所以我們就衍生出了第一種程序間通訊的方式:

-------管道

管道是在記憶體中直接申請空間,並且直接在其中寫入記憶體,直接從記憶體中讀取。

管道常用的分為有名管道和無名管道兩種;

有名管道:顧名思義,有名字的管道,這是我們需要申請乙個有名字的管道檔案,有名管道實現了無親緣關係間的通訊,原理是fifo提供了乙個路徑名與之關聯,讓fifo的檔案存於系統中,只要知道該檔案路徑,就可以進行訪問。fifo指代(fist in, fist out),即按照先進先出的工作。

有名管道的申請:mkfifo  fp_name  

通過在記憶體上開闢一塊全新的空間, a,

b 程序都通過檔案描述符操作這塊空

間。 以完成資料互動的功能。

1.2

有名管道

1.2.1

特性: 有名字的管道, 可以再任意兩個程序間傳遞資料。

管道檔案, 僅僅是目錄樹中的乙個標示, 並不在磁碟上空間。

1.2.2

建立:

mkfifo

命令 mkfifo();

函式1.2.3

使用:開啟:

open

讀取資料:

read

寫資料:

write

關閉:

close

1.2.4

管道檔案操作特點:

如果乙個程序以只寫開啟管道, 但是沒有以唯讀或讀寫開啟這個管道的進

程, 則開啟操作會阻塞, 直到有程序以讀或讀寫開啟,

open

才會返回。

如果乙個程序以唯讀開啟管道, 但是沒有以只寫或讀寫開啟這個管道的進

程, 則開啟操作會阻塞, 直到有程序以寫或讀寫開啟,

open

才會返回。

當寫端沒有寫入資料時, 讀端會阻塞到

read

呼叫, 直到寫端寫入資料或

者寫端關閉。

當管道沒有空間時, 再寫入資料就會被阻塞。 直到有程序讀取資料, 或者

所有的讀端關閉。

在同乙個目錄檔案下,我們建立乙個a.c  乙個b.c   乙個fifo的管道檔案  ,用a.c檔案編寫,b.c檔案讀取,編寫與讀取的物件都是fifo這個管道檔案。

#include

#include

#include

#include

#include

#include

#include

void fun(int sig)

int main()

;printf("inputs:  ");

fgets(buff,128,stdin);

if(strncmp(buff,"end",3)==0)

write(fd,buff,127);

}close(fd);

exit(0);}

#include

#include

#include

#include

#include

#include

int main()

;int n=0;

while((n=read(fd,buff,127))>0)

close(fd);

exit(0);}

1、 無名管道

1.1

概念: 相對於有名管道而言, 其沒有名稱, 所以不能在任意程序之間使用,

只能應用於父子程序之間。 其原理是父子程序檔案描述符共享。 所以,

fork

之前建立、

開啟無名管道。

1.2

建立並開啟:

int pipe(int fd[2]);

fd[0] :

讀端fd[1] :

寫端1.3

操作:讀資料:

read

寫資料:

write

關閉:

close

1.4

操作特點

要在父子程序中分別關閉乙個讀檔案描述符, 乙個寫檔案描述符。

#include

#include

#include

#include

#include

#include

#include

void main()

;int n=0;

if(( n=read(fd[0],buff,127))==0)

printf("child buff is %s   \n",buff);

}close(fd[0]);

}else

;//memset(buff,0,127);

printf("inputs :\n");

fgets(buff,128,stdin);

if(strncmp(buff,"end",3)==0)

write(fd[1],buff,strlen(buff));

}close(fd[1]);

}//exit(0);}

管道的寫端徹底關閉,讀端返回乙個0,

管道的讀端徹底關閉,寫資料會引發異常,也就收到sigpipe

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...