程序間通訊(ipc,interprocess communication)是指在不同程序之間傳播或交換資訊。
ipc的方式通常有管道(包括無名管道和命名管道)、訊息佇列、訊號量、共享儲存、socket、streams等。其中 socket和streams支援不同主機上的兩個程序ipc。
今天記錄一下我從中學的幾種通訊方式:無名管道、有名管道、訊息佇列、共享儲存、訊號、訊號量。
一、管道(無名管道和命名管道):
無名管道:
管道一般用於兩個不同程序之間的通訊。當乙個程序建立乙個管道,並呼叫fork建立自己的乙個子程序後,父程序關閉讀管道端,子程序關閉寫管道端,這樣就提供了兩個程序之間資料流動的一種方式。
#include#includeint main()
else
return 0;
命名管道:
「命名管道」又名「命名管線」(named pipes),是一種簡單的程序間通訊(ipc)機制。命名管道(namedpipe)是伺服器程序和乙個或多個客戶程序之間通訊的單向或雙向管道。
命名管道**:
writedemo.c**:
#include #include #include #include #include #include #include int main()
}close(fd);
return 0;
}
readdemo.c**:
#include #include #include #include #include int main();
int nread=0;
if(mkfifo("./pipetest",0600) == -1 && errno!=eexist)
int fd= open("./pipetest",o_rdonly); //以唯讀方式開啟檔案
printf("read successfull!\n");
while(1)
close(fd);
return 0;
}
第
二、訊息佇列:
訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向訊息佇列中按照一定的規則新增新訊息;對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。訊息佇列是隨核心持續的。由於訊息佇列用的不多,在這裡就不po**了,操作和上面類似。第
三、訊號與訊號量:
對於 linux來說,實際訊號是軟中斷,許多重要的程式都需要處理訊號。訊號,為 linux 提供了一種處理非同步事件的方法。比如,終端使用者輸入了 ctrl+c 來中斷程式,會通過訊號機制停止乙個程式。
訊號概述
訊號的名字和編號:
每個訊號都有乙個名字和編號,這些名字都以「sig」開頭,例如「sigio 」、「sigchld」等等。
訊號定義在signal.h標頭檔案中,訊號名都定義為正整數。
具體的訊號名稱可以使用kill -l來檢視訊號的名字以及序號,訊號是從1開始編號的,不存在0號訊號。kill對於訊號0又特殊的應用。
訊號的處理有三種方法,分別是:忽略、捕捉和預設動作。
訊號量:
什麼是訊號量:
訊號量是一種特殊的變數,訪問具有原子性。只允許對它進行兩個操作:
1)等待訊號量
當訊號量值為0時,程式等待;當訊號量值大於0時,訊號量減1,程式繼續執行。
2)傳送訊號量
將訊號量值加1。
訊號量用例**:
semaphore.c
#include #include #include #include union semun ;
void pgetthekey(int id)
void vputbackthekey(int id)
int main(int argc, char const *ar**)
else if(pid == 0)else
return 0;
}
第
四、共享儲存:
共享儲存區(share memory)是linux系統中通訊速度最高的通訊機制。該機制中共享記憶體空間和程序的虛位址空間滿足多對多的關係。即乙個共享記憶體空間可以對映多個程序的虛位址空間,乙個程序的虛位址空間又可以連線多個共享儲存區。當程序間預利用共享儲存區通訊時,先要在主存中建立乙個共享儲存區,然後將它附接到自己的虛位址空間。該機制只為程序提供了用於實現通訊的共享儲存區和對共享儲存區進行操作的手段,然而並未提供對該區進行互斥訪問及程序同步的措施。sharedmemorywrite.c**:
#include #include #include #include #include int main()
shmaddr = shmat(shmid,0,0); //shmat獲取訊號量的位址
printf("shmget is success!\n");
strcpy(shmaddr,"ray");
sleep(5);
shmdt(shmaddr);
shmctl(shmid,ipc_rmid,0); //shmctl控制訊號量,ipc_rmid刪除訊號量
printf("quit\n");
return 0;
}
sharedmemoryread.c**:
#include #include #include #include #include int main()
shmaddr = shmat(shmid,0,0); //找到訊號量所在的位址
printf("shmget is success!\n");
printf("data: %s\n:",shmaddr);
shmdt(shmaddr);
printf("quit\n");
return 0;
}
以上。
參考文章:
鏈結鏈結
程序間的五種通訊方式介紹
程序間通訊 ipc,interprocess communication 是指在不同程序之間傳播或交換資訊。ipc的方式通常有管道 包括無名管道和命名管道 訊息佇列 訊號量 共享儲存 socket streams等。其中 socket和streams支援不同主機上的兩個程序ipc。1.管道 pipe...
程序的五種通訊方式
一 管道 1 什麼是管道 我們把乙個程序連線到另乙個程序的資料流稱為乙個管道。它是最古老的程序通訊形式。2 原型 匿名管道 include 功能 建立 名管道 原型int pipe int fd 2 引數fd 件描述符陣列,其中fd 0 表 讀端,fd 1 表 寫端 返回值 成功返回0,失敗返回錯誤...
程序間通訊的五種方式
參考文獻 它是半雙工的 即資料只能在乙個方向上流動 具有固定的讀端和寫端,如果要進行雙工通訊,需要建立兩個管道 它只能用於具有親緣關係的程序之間的通訊 也是父子程序或者兄弟程序之間 它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read write 等函式。但是它不是普通的檔案,並不屬於其...