Linux linux程序間通訊

2021-09-23 10:33:28 字數 1303 閱讀 1291

程序間通訊是指在不同程序之間傳播或交換資訊

程序間通訊可分為以下幾類

管道(匿名管道和命名管道)

system ipc

訊息佇列(用於資料傳輸)

共享記憶體(用於資料共享)

訊號量(用於事件通知)

posix ipc

訊息佇列

共享記憶體

互斥量條件變數

訊號量讀寫鎖

主要介紹常用的如管道、訊息佇列、訊號量、共享記憶體這幾個。

一、管道

管道通常指匿名管道,它也是unix系統最古老的ipc形式。

1、特點:

它是半雙工的(即資料只能在乙個方向上流動),具有固定的讀端和寫端。

它只能用於具有親緣關係的程序之間的通訊(也是父子程序或者兄弟程序之間)。

它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read、write 等函式。但是它不是普通的檔案,並不屬於其他任何檔案系統,並且只存在於記憶體中。

2、建立管道

建立匿名管道

函式原型:

#includeint pipe(int pipefd[2]);
引數:

pipefd[2]:檔案描述符陣列,fd[0]表示讀端,fd[1]表示寫端

返回值:

成功返回0,失敗返回錯誤**

要關閉管道關閉這兩個檔案描述符即可。

建立命名管道

函式原型

int mkfifo( const char* name, mode_t mode)

1如mkfifo my.p

(mkfifo建立普通檔案)

mode為許可權

當 open 乙個fifo時,是否設定非阻塞標誌(o_nonblock)的區別:

1.若沒有指定o_nonblock(預設),唯讀 open 要阻塞到某個其他程序為寫而開啟此 fifo。類似的,只寫 open 要阻塞到某個其他程序為讀而開啟它。

2.若指定了o_nonblock,則唯讀 open 立即返回。而只寫 open 將出錯返回 -1 如果沒有程序已經為讀而開啟該 fifo,其errno置enxio。

等於用乙個名字代表記憶體空間

3、開啟管道檔案

int fd = open( name, o_rdonly);  //讀

int fd = open( name, o_wronly); //寫

4、匿名管道和命名管道的區別

匿名管道由pipe函式建立並開啟

命名管道由mkfifo函式建立,用open開啟

建立成功後,fifo和pipe語義相同。

Linux Linux程序間通訊之共享記憶體

1 共享記憶體概念引入 共享記憶體區是最快的ipc形式。一旦這樣的記憶體對映到共享它的程序的位址空間,這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料 2 共享記憶體資料結構 struct shmid ds struct ipc perm shm per...

Linux Linux程序間通訊之訊息佇列

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

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...