電腦版瀏覽器在線使用seo網(wǎng)絡(luò)推廣公司報(bào)價(jià)
?
【Linux之進(jìn)程間通信】
項(xiàng)目代碼獲取:https://gitee.com/chenshao777/linux-processes.git
(麻煩點(diǎn)個(gè)免費(fèi)的Star哦,您的Star就是我的寫作動(dòng)力!)
06.共享內(nèi)存
共享內(nèi)存是Linux進(jìn)程間的通信方式之一
創(chuàng)建共享內(nèi)存函數(shù)
int shmget(key_t key, size_t size, int shmflg);
參數(shù) | 含義 |
---|---|
key | IPC_PRIVATE或ftok()函數(shù)獲取 |
size | 共享內(nèi)存大小 |
shmflg | 權(quán)限 |
返回值:
成功返回共享內(nèi)存描述符
失敗返回-1
需要包含頭文件
#include <sys/ipc.h>
#include <sys/shm.h>
共享內(nèi)存和管道一樣
有的共享內(nèi)存只能在親緣關(guān)系的進(jìn)程間通信
有的可以在任意進(jìn)程間通信
這取決于第一個(gè)參數(shù) key
共享內(nèi)存的創(chuàng)建(用于親緣關(guān)系進(jìn)程間)
參數(shù) key 賦值為IPC_PRIVATE,表示用于親緣關(guān)系進(jìn)程
實(shí)例代碼:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>/*創(chuàng)建一個(gè)共享內(nèi)存int shmget(key_t key, size_t size, int shmflg);參數(shù):key : 用戶給定的鍵值,IPC對象的名字size: 共享內(nèi)存的大小shmflg: 共享內(nèi)存的權(quán)限返回值:成功返回有效的共享內(nèi)存標(biāo)識(shí)符,失敗返回-1查看內(nèi)核中IPC對象: ipcs -m刪除IPC對象: ipcrm -m shmid
*/
int main(int argc, char *argv[])
{int shm_id;//創(chuàng)建共享內(nèi)存(親緣進(jìn)程)shm_id = shmget(IPC_PRIVATE, 100, 0777);if(shm_id < 0){printf("共享內(nèi)存創(chuàng)建失敗\n");}printf("共享內(nèi)存創(chuàng)建成功,shm_id = %d\n",shm_id);//查看所有IPC對象system("ipcs -m");//刪除IPC對象char cmd[50] = {0};sprintf(cmd, "ipcrm -m %d", shm_id);system(cmd);//查看所有IPC對象system("ipcs -m");return 0;
}
運(yùn)行結(jié)果(創(chuàng)建內(nèi)存段后再刪除內(nèi)存段):
共享內(nèi)存創(chuàng)建成功,shm_id = 32778------------ 共享內(nèi)存段 --------------
鍵 shmid 擁有者 權(quán)限 字節(jié) 連接數(shù) 狀態(tài)
0x00000000 32768 hc 600 524288 2 目標(biāo)
0x00000000 32769 hc 600 524288 2 目標(biāo)
0x00000000 32772 hc 600 524288 2 目標(biāo)
0x00000000 6 hc 600 134217728 2 目標(biāo)
0x00000000 32776 hc 600 524288 2 目標(biāo)
0x00000000 32778 hc 777 100 0
0x00000000 15 hc 600 524288 2 目標(biāo)
0x00000000 16 hc 600 524288 2 目標(biāo)
0x00000000 19 hc 600 524288 2 目標(biāo) ------------ 共享內(nèi)存段 --------------
鍵 shmid 擁有者 權(quán)限 字節(jié) 連接數(shù) 狀態(tài)
0x00000000 32768 hc 600 524288 2 目標(biāo)
0x00000000 32769 hc 600 524288 2 目標(biāo)
0x00000000 32772 hc 600 524288 2 目標(biāo)
0x00000000 6 hc 600 134217728 2 目標(biāo)
0x00000000 32776 hc 600 524288 2 目標(biāo)
0x00000000 15 hc 600 524288 2 目標(biāo)
0x00000000 16 hc 600 524288 2 目標(biāo)
0x00000000 19 hc 600 524288 2 目標(biāo)
可以看到通過 ipcs -m 命令獲取到當(dāng)前共享內(nèi)存段中有
0x00000000 32778 hc 777 100 0
它的鍵值為 0,這表示它只能用于親緣進(jìn)程通信
共享內(nèi)存的創(chuàng)建(任意進(jìn)程間)
參數(shù) key 值通過 ftok(const char *pathname, int proj_id) 函數(shù)獲取
ftok(const char *pathname, int proj_id) 函數(shù)的第一個(gè)參數(shù)是文件路徑,當(dāng)前路徑就可以,第二個(gè)參數(shù)是一個(gè)int類型的值,可實(shí)際上只有8位(1~127)
成功返回Key值,失敗返回-1
示例代碼:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>/*創(chuàng)建一個(gè)共享內(nèi)存int shmget(key_t key, size_t size, int shmflg);參數(shù):key : 用戶給定的鍵值,IPC對象的名字size: 共享內(nèi)存的大小shmflg: 共享內(nèi)存的權(quán)限返回值:成功返回有效的共享內(nèi)存標(biāo)識(shí)符,失敗返回-1查看內(nèi)核中IPC對象: ipcs -m刪除IPC對象: ipcrm -m shmid
*/
int main(int argc, char *argv[])
{int shm_id;int key;key = ftok(".", 1);if(key < 0 ){printf("創(chuàng)建key失敗\n");return -1;}shm_id = shmget(key, 100, IPC_CREAT | 0777);if(shm_id < 0){printf("共享內(nèi)存創(chuàng)建失敗\n");}printf("共享內(nèi)存創(chuàng)建成功,shm_id = %d\n",shm_id);//查看所有IPC對象system("ipcs -m");//刪除IPC對象char cmd[50] = {0};sprintf(cmd, "ipcrm -m %d", shm_id);system(cmd);//查看所有IPC對象system("ipcs -m");return 0;
}
注意的是,shmget函數(shù)第一個(gè)參數(shù)要換為key變量,第三個(gè)參數(shù)要加上IPC_CREAT宏
shmget(key, 100, IPC_CREAT | 0777);
運(yùn)行結(jié)果:
共享內(nèi)存創(chuàng)建成功,shm_id = 32802------------ 共享內(nèi)存段 --------------
鍵 shmid 擁有者 權(quán)限 字節(jié) 連接數(shù) 狀態(tài)
0x00000000 32768 hc 600 524288 2 目標(biāo)
0x00000000 32769 hc 600 524288 2 目標(biāo)
0x00000000 32772 hc 600 524288 2 目標(biāo)
0x00000000 6 hc 600 134217728 2 目標(biāo)
0x00000000 32776 hc 600 524288 2 目標(biāo)
0x00000000 15 hc 600 524288 2 目標(biāo)
0x00000000 16 hc 600 524288 2 目標(biāo)
0x00000000 19 hc 600 524288 2 目標(biāo)
0x01011451 32802 hc 777 100 0 ------------ 共享內(nèi)存段 --------------
鍵 shmid 擁有者 權(quán)限 字節(jié) 連接數(shù) 狀態(tài)
0x00000000 32768 hc 600 524288 2 目標(biāo)
0x00000000 32769 hc 600 524288 2 目標(biāo)
0x00000000 32772 hc 600 524288 2 目標(biāo)
0x00000000 6 hc 600 134217728 2 目標(biāo)
0x00000000 32776 hc 600 524288 2 目標(biāo)
0x00000000 15 hc 600 524288 2 目標(biāo)
0x00000000 16 hc 600 524288 2 目標(biāo)
0x00000000 19 hc 600 524288 2 目標(biāo)
發(fā)現(xiàn)這一行中,鍵值不為0了,代表此共享內(nèi)存可以用于任意進(jìn)程間通信
0x01011451 32802 hc 777 100 0
key值 具體如何生成?
key 31-24 proj_id 低8位
key 23-16 pathname的st_dev屬性的低8位
key 15-0 pathname的st_ino屬性的低16位
32位組合而成一個(gè)int值,就是我們的ftok的返回值了