Linux 程序間通訊詳解

2021-10-01 12:55:53 字數 2062 閱讀 9095

pipe管道: 用於有血緣關係的程序間通訊。 ps aux | grep ls | wc -l

父子程序間通訊:

兄弟程序間通訊:

fifo管道:可以用於無血緣關係的程序間通訊。

命名管道:  mkfifo 

無血緣關係程序間通訊:

讀端,open fifo o_rdonly

寫端,open fifo o_wronly

檔案實現程序間通訊:

開啟的檔案是核心中的一塊緩衝區。多個無血緣關係的程序,可以同時訪問該檔案。
共享記憶體對映:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 建立共享記憶體對映

引數:

length:共享記憶體對映區的大小。(<= 檔案的實際大小)

prot: 共享記憶體對映區的讀寫屬性。prot_read、prot_write、prot_read|prot_write

flags: 標註共享記憶體的共享屬性。map_shared、map_private

fd: 用於建立共享記憶體對映區的那個檔案的 檔案描述符。

offset:預設0,表示對映檔案全部。偏移位置。需是 4k 的整數倍。

返回值:

失敗:map_failed (void*(-1)), errno

int munmap(void *addr, size_t length); 釋放對映區。

addr:mmap 的返回值

length:大小

使用注意事項:

1. 用於建立對映區的檔案大小為 0,實際指定非0大小建立對映區,出 「匯流排錯誤」。

2. 用於建立對映區的檔案大小為 0,實際制定0大小建立對映區, 出 「無效引數」。

3. 用於建立對映區的檔案讀寫屬性為,唯讀。對映區屬性為 讀、寫。 出 「無效引數」。

4. 建立對映區,需要read許可權。當訪問許可權指定為 「共享」map_shared是, mmap的讀寫許可權,應該 <=檔案的open許可權。 只寫不行。

5. 檔案描述符fd,在mmap建立對映區完成即可關閉。後續訪問檔案,用 位址訪問。

6. offset 必須是 4096的整數倍。(mmu 對映的最小單位 4k )

7. 對申請的對映區記憶體,不能越界訪問。

8. munmap用於釋放的 位址,必須是mmap申請返回的位址。

9. 對映區訪問許可權為 「私有」map_private, 對記憶體所做的所有修改,只在記憶體有效,不會反應到物理磁碟上。

10. 對映區訪問許可權為 「私有」map_private, 只需要open檔案時,有讀許可權,用於建立對映區即可。

mmap函式的保險呼叫方式:

1. fd = open("檔名", o_rdwr);

2. mmap(null, 有效檔案大小, prot_read|prot_write, map_shared, fd, 0);

父子程序使用 mmap 程序間通訊:

父程序 先 建立對映區。 open( o_rdwr) mmap( map_shared );

指定 map_shared 許可權

fork() 建立子程序。

乙個程序讀, 另外乙個程序寫。

無血緣關係程序間 mmap 通訊: 【會寫】

兩個程序 開啟同乙個檔案,建立對映區。

指定flags 為 map_shared。

乙個程序寫入,另外乙個程序讀出。

【注意】:無血緣關係程序間通訊。mmap:資料可以重複讀取。

fifo:資料只能一次讀取。

匿名對映:只能用於 血緣關係程序間通訊。

p = (int *)mmap(null, 40, prot_read|prot_write, map_shared|map_anonymous, -1, 0);

Linux 程序間通訊詳解二

訊息佇列 訊息佇列提供了本機上從乙個程序向另外乙個程序傳送一塊資料的方法 每個資料塊都被認為有乙個型別,接收者程序接收的資料塊可以有不同的型別值 訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是由上限的 msgmax 每個訊息佇列的總的位元組數是有上限的 msgmnb 系統上訊息佇列的總數也有乙...

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...