基本参考 《Unix环境高级编程》 第14.9节共享内存来学习。
需要说明的
讲shmget(key,size, flag)函数时,书上大概意识是说,
想访问已有的shm时,key不应与IPC_CREATE 同时指定。
- 已有此key的shm且size满足要求(已有shm的size ≥ 函数中指定的size)时,直接返回已有的shmid。
若size不满足,则失败返回-1 - 若未有此key的shm,则使用 key 和 size 创建新的IPC结构,并返回shmid;创建失败则返回-1.
点击查看代码
int shmid = shmget(key, SHM_SIZE, IPC_CREAT|IPC_EXCL|0666); //强制创建新的,且指定访问权bits位
int shmid = shmget(key, SHM_SIZE, 0); //强制使用已有的,且满足 size >= SHM_SIZE, 否则失败返回-1
int shmid = shmget(key, SHM_SIZE, IPC_CREAT); //若无此key的shm,则创建新的shmid并返回,创建失败返回-1;
//若已有此key的shm且size满足要求,直接返回已有的shmid;
//已有此key的shm但size不满足要求,同样失败返回-1.
Server端示例代码
废话不多说, 赶紧上代码,首先是server端,开辟共享内存shm并写入内容进去:
点击查看代码
#include <stdio.h>
//#include <unistd.h>
#include <sys types.h>
#include <sys ipc.h>
#include <sys shm.h>
#define SHM_PATH "/var/run/pnkey"
#define SHM_SIZE 128
int main(){
key_t key = ftok(SHM_PATH, 0x6666); //file to key,传入的文件SHM_PATH必须存在(权限不要求),否则失败返回-1
if(key<0){ printf("shm key return -1. please contact the device vendor."); } 强制创建1块新的共享内存shm,并设置访问权限位. int shmid="shmget(key," shm_size, ipc_creat|ipc_excl|0666); if(shmid <0 ){ printf("failed to get create share memory with (int)key ); 先尝试获取已有的shm 0, 0); retrive momory (int)key); -1; 查看获取的shm的size struct shmid_ds * buf; rst="shmctl(shmid," ipc_stat, buf); if(buf->shm_segsz != SHM_SIZE){
// printf("The retrived SHM has different size.\n");
// return -1;
// }
// }
//获取此key已有的共享内存shm,未找到时创建新的.[可替代上面的手动检索!]
int shmid = shmget(key, SHM_SIZE, IPC_CREAT);
//attach到进程空间
char * addr = shmat(shmid, NULL , 0);
if(addr <= 0 ){ printf("failed to attach share memory.\n"); return -1; } 使用shm,写入 sprintf(addr, "%s", "共享内存,您好~\n"); 0; < code></=></0){></sys></sys></sys></unistd.h></stdio.h>
Client端示例代码
接着是client端的,查找出已有的共享内存shm,并从中读取
点击查看代码
#include <stdio.h>
#include <string.h>
//#include <unistd.h>
#include <sys types.h>
#include <sys ipc.h>
#include <sys shm.h>
#define SHM_PATH "/var/run/pnkey"
#define SHM_SIZE 128
int main(){
key_t key = ftok(SHM_PATH, 0x6666);
if(key<0){ printf("shm key return -1. please contact the device vendor."); } char buf[128]; int shmid="shmget(key," shm_size, ipc_creat); 0); if(shmid <0){ printf("failed to retrive share memory.\n"); -1; * addr="shmat(shmid," null, shm_rdonly); 只读挂载 if(addr<="0){" map 使用shm,打印字符串. strcpy(buf, addr); printf("%s", buf); 可以直接打印,不必strcpy; 但得考虑同步问题,防止读写并发冲突。 0; < code></0){></sys></sys></sys></unistd.h></string.h></stdio.h>
Original: https://www.cnblogs.com/zhw618/p/15854216.html
Author: zhw618
Title: Linux下IPC之共享内存的使用方法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581790/
转载文章受原作者版权保护。转载请注明原作者出处!