Linux系統程式設計(三)

2021-07-29 01:39:37 字數 2797 閱讀 5094

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 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...