一、概念
程序間的通訊:是指在不同程序之間傳播或交換資訊,即a程序將「hello world」傳遞給b程序。
二、程序間的通訊方式
1、管道
管道實現的原理:通過在記憶體上開闢一塊全新的空間。a、b程序都通過檔案描述符操作這塊空間,以完成資料互動的功能。
1.1、無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向 流動,而且只能在具有父子程序間使用,不可以在任意兩個程序間傳遞資料。
1.1.1其原理:父子程序間檔案描述符共享;所以,fork之間建立、開啟無名管道。
1.1.2、建立並開啟:
int pipe(int fd[2]);
fd[0] //讀端
fd[1] //寫端
1.1.3、操作
讀資料:read
寫資料:write
關閉: close
1.1.4、操作特點:要在父子程序中分別關閉乙個讀檔案描述符,乙個寫檔案描述符。
1.2、有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
1.2.1、特性:有名字的管道,可以在任意兩個程序間傳遞資料。 管道檔案,僅僅是目錄樹中乙個標示,並不在磁碟上佔據 空間。
1.2.2、建立:mkfifo命令 mkfifo();函式。
1.2.3、使用:開啟(open)、讀取資料(read)、寫資料(write)、關閉(close)。
1.2.4、管道檔案操作特點:
a)如果乙個程序以只寫開啟管道,但是沒有以唯讀或者讀寫開啟這個管道的程序,則開啟操作會堵塞,直到有程序以讀或讀寫開啟,open才會返回。
b)如果乙個程序以唯讀開啟管道,但是沒有以只寫或者讀寫開啟這個管道的程序,則開啟操作會堵塞,直到有程序以寫或讀寫開啟,open才會返回。
c)當寫端沒有寫入資料時,讀端會阻塞到read呼叫,直到寫端寫入資料或者寫端關閉。
d)當管道沒有空間時,再寫入資料時就會阻塞, 直到有程序讀取資料或者所有讀端關閉。
2、訊號量:是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
2.1基本概念:
臨界資源: 同一時刻只能被乙個程序訪問的資源。
臨界區: 操作臨界資源的**區域
原子操作: 不能被中斷的操作, 操作一旦開始執行, 就必須執行結束, 中途不能被任何原因打斷。
2.2 作用:
程序同步執行: 乙個程序的執行需要另乙個程序提供一定的條件,程序非同步執行:訊號量就是完成程序同步控制的!
2.3 核心物件和鍵值對
核心物件: 系統核心中, 建立、 控制、 銷毀的乙個物件(變數)
鍵值對: key--val
2.4 訊號量的操作:
建立或者獲取: semget();
初始化: semctl();
p 操作: semop(); 當訊號量值<=0 時, 會阻塞執行
v 操作: semop();
刪除: semctl();
封裝訊號的操作: sem_get(); 獲取訊號量
sem_p(); -1 操作
sem_v(); +1 操作
sem_del(); 刪除操作2.5 訊號量的命令操作
檢視: ipcs -s
刪除: ipcrm -s id
3、訊息佇列: 在核心中建立乙個鍵值對, 用來維護訊息佇列的屬性資訊,傳送帶有型別的資料, 程序可以僅僅獲取特定型別的資料。 獲取指定型別的資料的時候, 採用佇列的特點: 先進先出。
4、共享記憶體:就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。
5、套接字( socket ) : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。
三、**
1、有名管道通訊實現**
//寫入資料
#include
#include
#include
#include
#include
#include
void main()
//讀取資料
#include
#include
#include
#include
#include
#include
void main()
2、訊號量實現**
#include
#include
#include
#include
#include
#include
#include
int semid;
union semun
;void sem_get(int key, int val);
void sem_p();
void sem_v();
void sem_del();
#include "sem.h"
#include
void main()
}
3、訊息佇列實現**
#include
#include
#include
#include
#include
#include
struct mymsg
;void main()
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...