Linux程序間通訊

2021-08-08 21:36:52 字數 3114 閱讀 5508

一、概念

程序間的通訊:是指在不同程序之間傳播或交換資訊,即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.管道與...