C共享内存
ftok —>文件到key,保证唯一性,存放在keys中,并且通过下面的方法将对应的字符串设置到进程的环境变量中,
以便fork出来的进程的可以访问这些环境变量:1
i = setenv(env_strings[apptype],envstr,1);
获取shm_id
1
shm_id = shmget (keys[apptype],sizeof(struct mem_blk),IPC_CREAT| IPC_EXCL|0x1ff);
更改shm_id相关的属性
1
2
3shmctl(shm_id,IPC_STAT,&shmbuf);
shmbuf.shm_perm.mode &= SHM_R| SHM_W;
shmctl(shm_id,IPC_SET,&shmbuf);获取相应的共享内存,并且初始化共享内存为0
1
pshm = (int8_t*)shmat(shm_id,NULL,0);
共享内存的删除:
1
shmctl(shm_id, IPC_RMID, 0)
(在其他进程子进程)连接共享内存:
1
2
3envstr = getenv(env_strings[apptype]);
shm_id = atoi(envstr);
pshm = ( int8_t*)shmat(shm_id,NULL,0);共享内存的读写:
通过6得到的pshm共享内存指针就可以往该共享内存块上进行读写共享内存操作命令:ipcs、ipcrm
- ipcs -m 显示共享内存:
1
2
3
4
5
6
7
8
9------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x740180a7 2686976 root 600 4 0
0x740a800c 3642337 root 600 4 0
0x00000000 5644578 nobody 600 16777216 129 dest
0x740aa00b 3609571 root 600 4 0
0x00000000 5677348 nobody 600 16777216 257 dest
0x00000000 5660117 nobody 600 16777216 257 dest
0x00000bde 5642887 root 666 63120208 1
字段|说明
—-|—-
key |是用来唯一标识这段共享内存的唯一标示;
shmid|是shmget返回的共享内存id;
owner|创建共享内存的用户
perms|读写权限
Bytes|标示key这段共享内存大小
nattach|表示attch到这段共享内存的数量- ipcrm -m shmid removes the shared memory segment identified by shmid after the last detach is performed.
- ipcs -m 显示共享内存: