MST

星途 面试题库

面试题:C语言在Linux下共享内存操作的基本步骤

请简述在Linux环境中,使用C语言进行共享内存操作的基本步骤,包括创建共享内存、映射共享内存到进程地址空间、进行数据读写以及撤销映射和删除共享内存。
23.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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