在学习的时候遇到问题,就是将结构体作为共享内存时将string类型置入结构体内,导致程序出现段错误,后来经过排查发现共享内存是c语言的库不支持string类型,需要用char name[20]代替。
1.在Linux中如何查看共享内存
(1)使用ipcs -m
命令查看当前系统中的共享内存段
(2)找到需要释放的共享内存的标识符(shmid),然后使用ipcrm -m shmid
命令来释放它
2.如何使用共享内存
在Linux系统中,共享内存是一种高效的进程间通信(IPC)方式,它允许多个进程访问同一块物理内存区域,从而实现数据的快速共享和传输。
-
ftok()
:生成一个唯一的键值(key),用于标识共享内存段。这个函数通常结合文件路径和项目ID(proj_id)来计算键值。 -
shmget()
:根据键值创建或获取共享内存段。函数原型为int shmget(key_t key, size_t size, int shmflg);
。其中,key
是ftok()
生成的键值,size
是共享内存段的大小,shmflg
是控制选项,如IPC_CREAT
(创建共享内存段)和IPC_EXCL
(与IPC_CREAT
一起使用时,如果共享内存已存在则失败)。 -
shmat()
:将共享内存段连接到当前进程的地址空间。函数原型为void *shmat(int shmid, const void *shmaddr, int shmflg);
。其中,shmid
是shmget()
返回的共享内存标识符,shmaddr
是建议连接的地址(通常传入NULL让系统自动选择),shmflg
是控制选项,如SHM_RDONLY
(以只读方式连接)。 -
shmdt()
:断开共享内存段与当前进程的连接。函数原型为int shmdt(const void *shmaddr);
。其中,shmaddr
是shmat()
返回的共享内存地址。 -
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);