程序的五種通訊方式

2021-08-24 23:06:01 字數 3061 閱讀 6922

一、管道

1、什麼是管道

我們把乙個程序連線到另乙個程序的資料流稱為乙個管道。它是最古老的程序通訊形式。

2、原型(匿名管道):

#include 功能:建立⼀⽆名管道

原型int pipe(int fd[2]);

引數fd:⽂件描述符陣列,其中fd[0]表⽰讀端, fd[1]表⽰寫端

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

3.管道的特點

(1).只能用於擁有共同祖先的程序進行通訊,通常乙個程序先建立管道,然後該程序呼叫fork,然後父子程序便可以一同應用此管道。

(2).管道提供流式服務。

(3).一般而言,程序退出管道釋放,管道的生命週期隨程序。

(4).一般而言,核心會對管道操作進行同步與互斥。

(5).管道是半雙工,資料只能向乙個方向流動,如果要實現雙方通訊時,則需要建立兩個管道。

二、命名管道

1.建立原因:管道本只能在擁有共同祖先的程序之間通訊,若想在無關程序之間通訊,那麼則使用fifo檔案來實現,被稱為命名管道。

2.建立命名管道

(1)命名管道可以從命令列建立

$ mkfifo filename
(2).命名管道也可以在程式中建立

int mkfifo(const char* filename, mode_t mode);
(3)建立命名管道

int main(int argc, char *argv)

3.匿名管道與命名管道的區別:

三、訊息佇列

1、概念

2.原型:

(1).msgget()函式

功能:⽤來建立和訪問⼀個訊息佇列

原型 int msgget(key_t key, int msg***);

引數 key: 某個訊息佇列的名字

msg***:由九個許可權標誌構成,它們的⽤法和建立⽂件時使⽤的mode模式標誌是⼀樣的

返回值:成功返回⼀個⾮負整數,即該訊息佇列的標識碼;失敗返回-1

(2)msgctl()函式

功能:訊息佇列的控制函式

原型 int msgctl(int msqid, int cmd, struct msqid_ds *buf);

引數 msqid: 由msgget函式返回的訊息佇列標識碼

cmd:是將要採取的動作,(有三個可取值)

返回值:成功返回0,失敗返回-1

(3)msgsnd()函式

功能:把⼀條訊息新增到訊息佇列中

原型 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);

引數 msgid: 由msgget函式返回的訊息佇列標識碼

msgp:是⼀個指標,指標指向準備傳送的訊息,

msgsz:是msgp指向的訊息⻓度,這個⻓度不含儲存訊息型別的那個long int⻓整型

msg***:控制著當前訊息佇列滿或到達系統上限時將要發⽣的事情

msg***=ipc_nowait表⽰佇列滿不等待,返回eagain錯誤。

返回值:成功返回0;失敗返回-1

(4).msgrcv()函式

功能:是從⼀個訊息佇列接收訊息

原型 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);

引數 msgid: 由msgget函式返回的訊息佇列標識碼

msgp:是⼀個指標,指標指向準備接收的訊息,

msgsz:是msgp指向的訊息⻓度,這個⻓度不含儲存訊息型別的那個long int⻓整型

msgtype:它可以實現接收優先順序的簡單形式

msg***:控制著佇列中沒有相應型別的訊息可供接收時將要發⽣的事

返回值:成功返回實際放到接收緩衝區⾥去的字元個數,失敗返回-1

四、共享記憶體

(1).shmget函式

功能:⽤來建立共享記憶體

原型 int shmget(key_t key, size_t size, int shm***);

引數 key:這個共享記憶體段名字

size:共享記憶體⼤⼩

shm***:由九個許可權標誌構成,它們的⽤法和建立⽂件時使⽤的mode模式標誌是⼀樣的

返回值:成功返回⼀個⾮負整數,即該共享記憶體段的標識碼;失敗返回-1

(2).shmat函式

原型 void *shmat(int shmid, const void *shmaddr, int shm***);

引數 shmid: 共享記憶體標識

shmaddr:指定連線的位址

shm***:它的兩個可能取值是shm_rnd和shm_rdonly

返回值:成功返回⼀個指標,指向共享記憶體第⼀個節;失敗返回-1

(3).shmdt函式

功能:將共享記憶體段與當前程序脫離

原型 int shmdt(const void *shmaddr);

引數 shmaddr: 由shmat所返回的指標

返回值:成功返回0;失敗返回-1

注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段

(4).shmctl函式

功能:⽤於控制共享記憶體

原型 int shmctl(int shmid, int cmd, struct shmid_ds *buf);

引數 shmid:由shmget返回的共享記憶體標識碼

cmd:將要採取的動作(有三個可取值)

buf:指向⼀個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

返回值:成功返回0;失敗返回-1

五、訊號量

訊號量本質上是乙個計數器

訊號量結構體偽**:

struct semaphore

程序間通訊的五種方式

參考文獻 它是半雙工的 即資料只能在乙個方向上流動 具有固定的讀端和寫端,如果要進行雙工通訊,需要建立兩個管道 它只能用於具有親緣關係的程序之間的通訊 也是父子程序或者兄弟程序之間 它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read write 等函式。但是它不是普通的檔案,並不屬於其...

程序間通訊的五種方式

前言 程序通訊 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序a把資料從使用者空間拷到核心緩衝區,程序b再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊。程序間通訊 ipc 介紹 程序間通...

程序間的五種通訊方式介紹

程序間通訊 ipc,interprocess communication 是指在不同程序之間傳播或交換資訊。ipc的方式通常有管道 包括無名管道和命名管道 訊息佇列 訊號量 共享儲存 socket streams等。其中 socket和streams支援不同主機上的兩個程序ipc。1.管道 pipe...