程序間通訊: 管道,訊號量,儲存空間,訊息佇列,套接字(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 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...