面试题答案
一键面试- 创建共享内存:
- 使用
shmget
函数。其原型为int shmget(key_t key, size_t size, int shmflg);
。 key
是共享内存的键值,可以通过ftok
函数生成,例如key_t key = ftok(".", 'a');
,其中“.”是当前目录,'a'是一个自定义的项目标识符。size
是共享内存的大小,以字节为单位。shmflg
是权限标志,如IPC_CREAT | 0666
,IPC_CREAT
表示如果共享内存不存在则创建,0666表示读写权限。示例:int shmid = shmget(key, 1024, IPC_CREAT | 0666);
- 使用
- 映射共享内存到进程地址空间:
- 使用
shmat
函数。其原型为void *shmat(int shmid, const void *shmaddr, int shmflg);
。 shmid
是shmget
返回的共享内存标识符。shmaddr
通常设为NULL
,表示让系统自动选择合适的地址进行映射。shmflg
一般设为0。返回值是指向映射内存区域的指针,例如void *shmptr = shmat(shmid, NULL, 0);
- 使用
- 进行数据读写:
- 得到映射的指针
shmptr
后,就可以像操作普通内存一样进行数据的读写。例如,如果共享内存用于存储一个整数,可以这样写:*(int *)shmptr = 42;
,读操作类似int value = *(int *)shmptr;
- 得到映射的指针
- 撤销映射:
- 使用
shmdt
函数。其原型为int shmdt(const void *shmaddr);
。 shmaddr
是之前shmat
返回的映射内存指针。示例:int ret = shmdt(shmptr);
,如果返回值为0表示撤销映射成功。
- 使用
- 删除共享内存:
- 使用
shmctl
函数。其原型为int shmctl(int shmid, int cmd, struct shmid_ds *buf);
。 shmid
是共享内存标识符。cmd
设为IPC_RMID
表示删除共享内存。buf
可以设为NULL
。示例:int ret = shmctl(shmid, IPC_RMID, NULL);
,如果返回值为0表示删除共享内存成功。
- 使用