共享内存C(Linux)

在学习的时候遇到问题,就是将结构体作为共享内存时将string类型置入结构体内,导致程序出现段错误,后来经过排查发现共享内存是c语言的库不支持string类型,需要用char name[20]代替。

1.在Linux中如何查看共享内存

(1)使用ipcs -m命令查看当前系统中的共享内存段

(2)找到需要释放的共享内存的标识符(shmid),然后使用ipcrm -m shmid命令来释放它

2.如何使用共享内存

在Linux系统中,共享内存是一种高效的进程间通信(IPC)方式,它允许多个进程访问同一块物理内存区域,从而实现数据的快速共享和传输。

  1. ftok():生成一个唯一的键值(key),用于标识共享内存段。这个函数通常结合文件路径和项目ID(proj_id)来计算键值。

  2. shmget():根据键值创建或获取共享内存段。函数原型为int shmget(key_t key, size_t size, int shmflg);。其中,keyftok()生成的键值,size是共享内存段的大小,shmflg是控制选项,如IPC_CREAT(创建共享内存段)和IPC_EXCL(与IPC_CREAT一起使用时,如果共享内存已存在则失败)。

  3. shmat():将共享内存段连接到当前进程的地址空间。函数原型为void *shmat(int shmid, const void *shmaddr, int shmflg);。其中,shmidshmget()返回的共享内存标识符,shmaddr是建议连接的地址(通常传入NULL让系统自动选择),shmflg是控制选项,如SHM_RDONLY(以只读方式连接)。

  4. shmdt():断开共享内存段与当前进程的连接。函数原型为int shmdt(const void *shmaddr);。其中,shmaddrshmat()返回的共享内存地址。

  5. shmctl():控制共享内存段,如删除共享内存段等。函数原型为int shmctl(int shmid, int cmd, struct shmid_ds *buf);。其中,shmid是共享内存标识符,cmd是控制命令(如IPC_RMID用于删除共享内存段),buf是指向shmid_ds结构的指针,用于传递控制信息。

具体代码:

    //共享内存的指针
    struct my_map *ptr;
    int *ptriter;
    
    //创建共享内存
	//将内存分离出来
	int shmid=shmget((key_t)0x5005,sizeof(struct my_map)*20,0640|IPC_CREAT);

	int shmiter=shmget((key_t)0x1001,4,0640|IPC_CREAT);	


	if(shmid==-1){cout<<"结构体共享内存创建失败"<<"\n\n";return 0;}
	if(shmiter==-1){cout<<"共享内存iter创建失败\n\n";}

    //给每个进程创建指针指向这个共享内存
    ptr=(struct my_map*)shmat(shmid,NULL,0);
	ptriter=(int*)shmat(shmiter,NULL,0);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值