1.共享内存控制
shmctl函数实现共享内存属性的控制。
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
cmd:函数功能的控制,其取值如下: IPC_RMID:删除。(常用 ) IPC_SET:设置 shmid_ds 参数,相当于把共享内存原来的属性值替换为 buf 里的属性值。 IPC_STAT:保存 shmid_ds 参数,把共享内存原来的属性值备份到 buf 里。 SHM_LOCK:锁定共享内存段( 超级用户 )。 SHM_UNLOCK:解锁共享内存段。 SHM_LOCK 用于锁定内存,禁止内存交换。并不代表共享内存被锁定后禁止其它进程访问。其真正的意义是:被锁定的内存不允许被交换到虚拟内存中。这样做的优势在于让共享内存一直处于内存中,从而提高程序性能。
buf:shmid_ds 数据类型的地址(具体类型请点此链接 ),用来存放或修改共享内存的属性。
返回值:
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define BUFF_SIZE 1024
int main(int argc, char *argv[])
{
int shmid;
key_t key;
int ret;
key = ftok("./", 2021);
if(key == -1)
{
perror("error to ftok:");
exit(-1);
}
//创建共享内存
shmid = shmget(key, BUFF_SIZE, IPC_CREAT|0666);
if(shmid == -1)
{
perror("error to shmget:");
exit(-1);
}
printf("shmid=%d\n",shmid);
system("ipcs -m");
//删除共享内存
shmctl(shmid, IPC_RMID, NULL);
system("ipcs -m"); //查看共享内存
return 0;
}
运行结果:
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
shmid=65537
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000072 0 root 444 1 5
0xe5010131 65537 root 666 1024 0
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000072 0 root 444 1 5