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...