IPC PRIVATE和ftok的比較

2021-06-27 17:47:18 字數 1814 閱讀 4963

ipc_private和ftok的比較

華清遠見嵌入式學院講師。

在linux中,可以使用ipc物件來進行程序間通訊。ipc物件存在於核心中,多程序可以操作同乙個ipc物件。

每個ipc物件都有乙個唯一的編號,該編號是由系統分配的。那麼不同的程序如何知道這個編號,進而通過它進行通訊呢?下面以共享記憶體為例,進行分析。

方法一:通過ftok函式,產生相同的鍵值。

假設,程序p1建立了共享記憶體。可以在建立時,呼叫ftok函式,得到乙個key值,呼叫shmget函式,該函式會返回所建立共享記憶體的編號,並將key和編號關聯起來。若程序p2想利用這個共享記憶體和p1程序通訊,也可以呼叫ftok函式,得到同樣的key,再根據key值,呼叫shmget函式,就可以獲得該共享記憶體的編號。該過程可以通過下面的圖來表達。

ftok函式原型如下:

#include < sys/types.h>

#include < sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);

第乙個引數pathname,是乙個存在的檔案或目錄名;

第二個引數proj_id,是非0整數

該函式會返回乙個key值,先執行的程序根據key來建立物件,後執行的程序根據key來開啟物件。示意圖如下:

使用 ftok建立共享記憶體,毫無關係的程序,可以通過得到同樣的key,來操作同乙個共享記憶體,對共享記憶體進行讀寫時,需要利用訊號量進行同步或互斥。

方法二:使用ipc_private物件

使用ipc_private建立的ipc物件, key值屬性為0,和ipc物件的編號就沒有了對應關係。這樣毫無關係的程序,就不能通過key值來得到ipc物件的編號(因為這種方式建立的ipc物件的key值都是0)。因此,這種方式產生的ipc物件,和無名管道類似,不能用於毫無關係的程序間通訊。但也不是一點用處都沒有,仍然可以用於有親緣關係的程序間通訊。示例程式如下:

#include < stdio.h>

#include < stdlib.h>

#include < errno.h>

#include < sys/ipc.h>

#include < sys/types.h>

#include < sys/shm.h>

#include < string.h>

#define maxsize 1024

int main()

#endif

if ((shmid = shmget(ipc_private, maxsize, 0666)) == -1)

if ((pid = fork()) == -1)

if (pid == 0)

strcpy(p, "hello\n");

system("ipcs -m");

if (shmdt(p) == -1)

system("ipcs -m");

}else

printf("%s\n", (char *)p);

if (shmctl(shmid, ipc_rmid, null) == -1)

}return 0;

}該程式中,父程序使用ipc_private方式建立了共享記憶體,然後fork產生了子程序,由於子程序是複製父程序的方式產生的,因此,子程序也可以操作共享記憶體。子程序往共享記憶體裡寫了內容後,父程序可以讀到。

ftok函式用法

系統建立ipc通訊 如訊息佇列 共享記憶體時 必須指定乙個id值。通常情況下,該id值通過ftok函式得到。ftok原型如下 key t ftok char fname,int id fname就時你指定的檔名 該檔案必須是存在而且可以訪問的 id是子序號,雖然為int,但是只有8個位元被使用 0 ...

系統函式ftok

系統建立ipc通訊 如訊息佇列 共享記憶體時 必須指定乙個id值。通常情況下,該id值通過ftok函式得到。ftok原型如下 key t ftok char fname,int id fname就時你指定的檔名,id是子序號。在一般的unix實現中,是將檔案的索引節點號取出,前面加上子序號得到key...

key t IPC鍵和ftok函式詳解和剖析

統建立ipc通訊 如訊息佇列 共享記憶體時 必須指定乙個id值。通常情況下,該id值通過ftok函式得到。ftok原型如下 key t ftok char fname,int id fname就時你指定的檔名 該檔案必須是存在而且可以訪問的 id是子序號,雖然為int,但是只有8個位元被使用 0 2...