ipc(程序間通訊)
檔案型別:
- 檔案
d 目錄
l 符號鏈結
偽檔案:
s 套接字
b 塊裝置
c 字元裝置
d 管道
管道:
是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞。呼叫pipe系統函式即可建立乙個管道,有如下特質
①本質是乙個偽檔案(實為核心緩衝區)
②由兩個檔案描述符引用,乙個表示讀端乙個表示寫端
③規定資料從管道的寫端流入管道,從讀端流出
管道的原理:管道實為核心使用的環形佇列機制,借助核心緩衝區(4k)實現
管道的侷限性:
①資料自己讀不能自己寫
②資料一旦被讀走,便不再管道中存在,不可反覆讀取
③由於管道採用半雙工通訊方式。因此,資料只能在乙個方向上流動
④只有在有公共程序間使用管道
pipe
建立管道
int pipe(int pipefd[2])
成功 0 失敗 -1 設定errno
函式呼叫成功返回r/w兩個檔案描述符。無需open但需要手動close.規定fd[0]為讀 fd[1]為寫
建立管道成功以後,建立該管道的程序(父程序)同時掌握管道的讀端和寫端。如何書寫父子程序間通訊呢。通常由下面的方法
管道一般讀寫行為
0;}fifo(有名管道)
用於非血緣關係程序間通訊
共享記憶體:
1mmap函式:引數
返回值
void *mmap(void *addr,size_length,int port,int flags,int fd, off_toffset)
返回:成功:返回建立的對映區首位址;失敗:map_failed巨集引數:
addr:建立對映區的首位址,由linux核心指定。使用時直接傳遞null
length:欲建立對映區的大小
prot:對映區許可權 prot_read,prot_write,prot_read|prot_write
flags:標誌位引數(常用於設定更新物理區域,設定共享,建立匿名區)map_shared:會將對映區所做的操作反映到物理裝置(磁碟)上
map_private:對映區所做的修改不會反映到物理裝置
fd :用來建立對映區的檔案描述符
offset:對映檔案的偏移(4k的整數倍)
#include
#include
#include
#include
#include
#include
int main(void)
len = ftruncate(fd, 4);
if(len == -1)
p = mmap(null,4,prot_read|prot_write,map_shared,fd,0);
if(p == map_failed)
strcpy(p,"abc")//寫資料
ret = munmap(p,4);
if(ret == -1)
close(fd);
return
0;}
注意:①建立對映區的許可權要小於等於開啟檔案
②建立檔案對映區的時候隱含一次對檔案的讀操作
③ offset必須是4k的整數倍(mmu幫助對映的,所以要為4k)
④ 一定檢測mmap的返回值
⑤檔案描述符先關閉對建立對映區沒有影響
mmap 父子程序間通訊
父子等有血緣關係的程序之間也可以通過mmap建立對映區來完成資料通訊,但相應的在建立對映區時指定對應的標誌位引數flags:
map_private:(私有對映)父子程序各自獨佔對映區
map_shared(共享對映)父子程序共享對映
結論:父子程序共享 1 開啟的檔案 2mmap建立的對映區(必須使用map_shared)
4匿名對映區
同樣需要借助標誌位引數flags來指定。
使用map_anonymous
如:int *p = mmap(null,4,prot_read|prot_write,map_shared|map_anonymous,-1,0);
「4」隨意列舉,該位置表示大小,可依據實際需要填寫。
注意:map_anonymous 和map_anon這兩個巨集是linux作業系統特有的巨集,在類linux系統中無該巨集,可以使用如下兩步完成匿名對映區的建立。
①fd = open(「/dev/zero」,o_rdwr);
② p = mmap(null,size,prot_read|prot_write,mmap_shared,fd,0)
mmap用於非血緣關係程序間通訊
Linux系統程式設計 網路程式設計基礎(三)
若在網路中,需要使客戶端連線的位址為乙個有效的ip位址,這樣就能在兩台計算機之間通訊。除ip位址外,計算機名也可用來代表一台網路中的計算機。通過訪問主機資料庫實現的。伺服器資料庫介面函式在標頭檔案netdb.h中定義。與此相關的函式有gethostbyaddr 和gethostbyname 兩個,一...
Linux 系統程式設計
1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...
Linux系統程式設計
1.linux程序 守護程序 脫離終端的後台程序 2.linux程序 殭屍程序 3.linux 下程序通訊 其中setsockopt server sockfd,sol socket,so reuseaddr,on,sizeof on 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...