Linux程序間通訊

2021-09-23 06:13:07 字數 3690 閱讀 3219

參考文章:

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

[2] 《嵌入式linux開發教程(上冊)》

程序間通訊(ipc,interprocess communication)是指在不同程序之間傳播或交換資訊。

ipc的方式通常有管道(包括無名管道和命名管道)共享儲存訊息佇列訊號量、socket、streams等。其中 socket和streams支援不同主機上的兩個程序ipc。

管道是乙個程序連線資料流到另外乙個程序的通道,它通常被用作把乙個程序的輸出通過管道連線到拎乙個程序的輸入。管道分為匿名管道命名管道(fifo:先進先出)。

特點:pipe()函式可以用來建立一條匿名管道,它的原型如下:

#include int pipe(int pipefd[2]);

//pipefd[0] : 讀端read

//pipefd[1] : 寫端write

函式成功返回0,否則返回-1。

單個程序中匿名管道的使用:

單個程序中的管道幾乎沒有任何用處。所以,通常呼叫 pipe 的程序接著呼叫 fork,這樣就建立了父程序與子程序之間的 ipc 通道

fork程序之間的匿名管道通訊:

#include #include #include #include /* 父程序向管道寫入字串hello son                 :關閉讀fd[0] : close

* 子程序讀取管道,並且列印出所讀取的字串:關閉寫fd[1] : close

* */

int main()

else

}

輸出:

命名管道也被成為fifo檔案。

特點:建立匿名管道

mkfifo()函式用來建立乙個命名管道,它的原型如下:

#include #incldue int mkfifo(char * pathname, mode_t mode);
刪除命名管道如果要刪除乙個使用完的fifo檔案,則需要unlink命令,示例如下:

linux也提供了乙個相應的unlink函式:linux常用c函式

共享記憶體就是兩個(或多個)程序共同占有一段記憶體空間,這些程序可以是有親緣關係的程序,也可以是完全不相關的程序。同一塊物理記憶體空間被對映到兩個程序,兩個程序都可以訪問這段共享空間從而實現了程序間通訊。但是值得注意的是:linux的共享記憶體通訊只提供了資料交換功能,並沒有提供同步機制,需要使用其它機制來同步不同程序對共享記憶體的讀寫操作(如訊號量)。

共享記憶體區設計四個主要步驟:

指定乙個名字引數呼叫shm_open,以建立乙個新的共享記憶體區物件(或開啟乙個已經存在的共享記憶體區物件);

呼叫mmap()把這個共享記憶體區對映到呼叫程序的位址空間

呼叫munmap()取消共享記憶體對映

呼叫shm_unlink()函式函式共享記憶體段

函式原型:

#include #include #include int shm_open(const char* name, int oflag, mode_t mode);
函式成功返回建立或開啟的記憶體共享描述符,與檔案描述符作用相同,否則返回-1

引數name:指定建立的共享記憶體名稱,其他程序可以根據這個名稱來開啟共享記憶體

引數flag可以為以下值:

引數mode只有指定o_creat才有效,指出共享記憶體的許可權,與open()函式類似

注意:新建立或者開啟的共享記憶體大小預設為0,需要設定大小才能使用。

使用ftruncate()函式來調整檔案或者共享記憶體的大小,原型如下:

#include #include int ftruncate(int fd, off_t length);
函式成功返回0,失敗返回-1

引數fd:需要調整的共享記憶體或者檔案。

引數length:需要調整的大小(單位是位元組)。

#include void * mmap(void *addr, size_t length, int prot, int flag, int fd, off_t offset);
函式成功返回對映後指向共享記憶體的虛擬位址,失敗則返回map_failed值。

引數如下:

len:對映的位元組數

port:對對映訪問區的保護要求,對對映儲存區的保護要求不能超過檔案open模式的訪問許可權。他可以使用一下標誌或值:

flag:對映標誌位,可以為以下標誌或值

map_shared:對程序對同乙個檔案的對映是共享的,乙個京城對對映的記憶體做了修改,另乙個程序也會看到這個變化;

map_pricate:多程序對同乙個對映區不是共享的,乙個程序對對映的記憶體進行了修改,另外乙個程序看不到這個變化;

fd:要被對映的檔案描述符或者共享記憶體的描述符

offset:要對映位元組在檔案中的起始偏移量。

在已經建立的共享記憶體對映,可以使用munmap()函式來取消。munmap()函式原型如下:

#include int munmap(coid *addr,size_t length);
函式成功返回0,否則返回-1.

length:對映的位元組數

取消對映後在對對映位址物件訪問會導致呼叫程序收到sigsegc訊號。

當使用完共享記憶體後,需要將其刪除以釋放系統資源,可以通過shm_unlink()函式完成,其原型如下:

#include #include #include int shm_unlink(const char * name);
函式成功返回0,否則返回-1.

引數name為共享記憶體的名字。

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...