一、管道
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...