日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux进程通信中IPC对象——IPC_PRIVATE与ftok

發(fā)布時(shí)間:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程通信中IPC对象——IPC_PRIVATE与ftok 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在linux中,可以使用IPC對象來進(jìn)行進(jìn)程間通信。IPC對象存在于內(nèi)核中,多進(jìn)程可以操作同一個(gè)IPC對象。每個(gè)IPC對象都有一個(gè)唯一的編號,該編號是由系統(tǒng)分配的。那么不同的進(jìn)程如何知道這個(gè)編號,進(jìn)而通過它進(jìn)行通信呢?下面以共享內(nèi)存為例,進(jìn)行分析。

方法一:通過ftok函數(shù),產(chǎn)生相同的鍵值。

假設(shè),進(jìn)程p1創(chuàng)建了共享內(nèi)存。可以在創(chuàng)建時(shí),調(diào)用ftok函數(shù),得到一個(gè)key值,調(diào)用shmget函數(shù),該函數(shù)會返回所創(chuàng)建共享內(nèi)存的編號,并將key和編號關(guān)聯(lián)起來。若進(jìn)程p2想利用這個(gè)共享內(nèi)存和p1進(jìn)程通信,也可以調(diào)用ftok函數(shù),得到同樣的key,再根據(jù)key值,調(diào)用shmget函數(shù),就可以獲得該共享內(nèi)存的編號。該過程可以通過下面的圖來表達(dá)。

ftok函數(shù)原型如下:
????????????????#include < sys/types.h>
????????????????#include < sys/ipc.h>
????????????????key_t ftok(const char *pathname, int proj_id);

第一個(gè)參數(shù)pathname,是一個(gè)存在的文件或目錄名;

第二個(gè)參數(shù)proj_id,是非0整數(shù)(一般用i節(jié)點(diǎn)號)

該函數(shù)會返回一個(gè)key值,先運(yùn)行的進(jìn)程根據(jù)key來創(chuàng)建對象,后運(yùn)行的進(jìn)程根據(jù)key來打開對象。示意圖如下:

使用 ftok創(chuàng)建共享內(nèi)存,毫無關(guān)系的進(jìn)程,可以通過得到同樣的key,來操作同一個(gè)共享內(nèi)存,對共享內(nèi)存進(jìn)行讀寫時(shí),需要利用信號量進(jìn)行同步或互斥。

方法二:使用IPC_PRIVATE對象

使用IPC_PRIVATE創(chuàng)建的IPC對象, key值屬性為0,和IPC對象的編號就沒有了對應(yīng)關(guān)系。這樣毫無關(guān)系的進(jìn)程,就不能通過key值來得到IPC對象的編號(因?yàn)檫@種方式創(chuàng)建的IPC對象的key值都是0)。因此,這種方式產(chǎn)生的IPC對象,和無名管道類似,不能用于毫無關(guān)系的進(jìn)程間通信。但也不是一點(diǎn)用處都沒有,仍然可以用于有親緣關(guān)系的進(jìn)程間通信。示例程序如下:

#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 1024int main(){int shmid;char *p = NULL;pid_t pid;key_t key;if ((key = ftok(".", 'a')) == -1){perror("ftok");exit(-1);}if ((shmid = shmget(IPC_PRIVATE, MAXSIZE, 0666)) == -1){perror("shmget");exit(-1);}if ((pid = fork()) == -1){perror("fork");exit(-1);}if (pid == 0){if ((p = shmat(shmid, NULL, 0)) == (void *)-1){perror("shmat");exit(-1);}strcpy(p, "hello\n");system("ipcs -m");if (shmdt(p) == -1){perror("shmdt");exit(-1);}system("ipcs -m");}else{getchar();if((p = shmat(shmid, NULL, 0)) == (void *)-1){perror("shmat");exit(-1);}printf("%s\n", (char *)p);if (shmctl(shmid, IPC_RMID, NULL) == -1){perror("RM");exit(-1);}}return 0;
}

該程序中,父進(jìn)程使用IPC_PRIVATE方式創(chuàng)建了共享內(nèi)存,然后fork產(chǎn)生了子進(jìn)程,由于子進(jìn)程是復(fù)制父進(jìn)程的方式產(chǎn)生的,因此,子進(jìn)程也可以操作共享內(nèi)存。子進(jìn)程往共享內(nèi)存里寫了內(nèi)容后,父進(jìn)程可以讀到。

轉(zhuǎn)自https://blog.csdn.net/niepangu/article/details/55271708

總結(jié)

以上是生活随笔為你收集整理的Linux进程通信中IPC对象——IPC_PRIVATE与ftok的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。