C++(0)-linux-共享内存

进程间通信,效率最高的就是共享内存。进程退出时,对共享内存毫无影响。
1.基础操作
  1.1.创建共享内存
  1.2.进程和共享内存关联
  1.3.进程与共享内存分离
  1.4.删除共享内存
2.示例
3.




1.基础操作
  1.1.创建共享内存 
shmget
  1.2.进程和共享内存关联shmat
  1.3.进程与共享内存分离shmdt
  1.4.删除共享内存shmctl

  1.1.shmget

int shmget(key_t key,size_t,size,int shmflg);
    key:记录共享内存在内核中的位置  key>0的整数
    size: 内存大小 如果是打开,size=0
    shmflg:IPC_CREAT|IPC_EXCL 是否存在
           IPC_CREAT| 0664    一个权限
 返回值:-1 失败

//示例:
int shmid=shmget(100,4096,IPC_CREAT|0664);//创建
int shmid=shmget(100,4096,IPC_CREAT|0664);//打开
int shmid=shmget(100,0,0);                //打开

1.2.关联 shmat
 

函数定义与调用
void  *shmat(int shmid,const void *shmaddr,int shmflg);
       shmid:   shmget()函数的返回值
       shmaddr: NULL->委托内核区指定
       shmflg:  0为读写
成功:地址
失败:-1

void *ptr=shmat(shmid,NULL,0)//函数的调用
memcpy(ptr,"***",len);       //写内存
printf("%s",(char*)ptr);     //读内存

1.3.分离 shmdt

int shmdt(const void*shaddr):
    成功:0
    失败:-1


1.4.删除shmctl

//fcntl
//setsockopt
//getsockopt
int shmctl(int shmid,int cmd,stuct shmid_ds *buf);
    shmid:通过这个参数访问共享内存 shmget() 函数的返回值
    cmd:IPC_STAT: 获取状态
        IPC_SET: 设置状态
        IPC_RMID:标记
    buf:
      cmd==IPC_STAT:传入
      cmd==IPC_SET: 传出
      cmd==IPC_RMID:指定为NULL

shmctl(shmid,IPC_RMID,NULL)

2.示例
 

#include<>
#include<sys/ipc.h>
#include<sys/shm.h>

//write_shm.c   gcc write_shm.c -o write
int main_write()
{
  //1.创建或者打开
  int shmid=shmget(100,4096,IPC_CREAT|0664);
  //2.关联
  void *ptr=shmat(shmid,NULL,0);
  //3.写共享内存
  const char* pt="这是一块共享内存---";
  memcpy(ptr,pt,strlen(pt)+1);

  printf("按任意键继续\n");
  getchar();
  //4.解除关联
  shmdt(ptr);
  //5.删除共享内存
  shmctl(shmid,IPC_RMID,NULL);
  return 0; 
  
}
//read_shm.c  gcc read_shm.c -o read
int main_read()
{
//1.打开
  int shmid=shmget(100,0,0);
  //2.关联
  void *ptr=shmat(shmid,NULL,0);
  //3.读共享内存
  printf("%s\n",(char*)ptr);
  printf("按任意键继续\n");
  getchar();
  //4.解除关联
  shmdt(ptr);
  //5.删除共享内存
  shmctl(shmid,IPC_RMID,NULL);
  return 0; 
  
}

3.注意事项
3.1多少个进程在访问这个共享内存  struct shmid_ds :shm_nattch
3.2可以多次删除
3.3共享内存操作命令
     




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值