MST
星途 面试题库

面试题:C语言中Linux共享内存访问控制的基本步骤

在Linux环境下,使用C语言进行共享内存访问控制,简述从创建共享内存到完成进程间安全访问数据的基本步骤,并写出关键函数及其参数意义。
35.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 创建共享内存
    • 使用shmget函数。
    • 函数原型:int shmget(key_t key, size_t size, int shmflg);
    • 参数意义:
      • key:是一个键值,用于标识共享内存对象,通常使用ftok函数生成。它就像共享内存的“名字”,不同进程通过相同的key来访问同一共享内存。
      • size:指定共享内存的大小,以字节为单位。
      • shmflg:权限标志,如IPC_CREAT表示如果共享内存不存在则创建,还可以与权限位(如0666)进行按位或操作来设置共享内存的访问权限。
  2. 将共享内存连接到进程地址空间
    • 使用shmat函数。
    • 函数原型:void *shmat(int shmid, const void *shmaddr, int shmflg);
    • 参数意义:
      • shmid:是shmget函数返回的共享内存标识符。
      • shmaddr:通常设为NULL,表示让系统自动选择合适的地址将共享内存连接到进程地址空间。如果指定非NULL地址,系统会尝试将共享内存连接到该地址,但不一定能成功。
      • shmflg:标志位,一般设为0。如果设为SHM_RDONLY,则以只读方式连接共享内存。
  3. 进程间安全访问数据
    • 可以使用信号量来实现同步。
    • 例如创建信号量使用semget函数。
    • 函数原型:int semget(key_t key, int nsems, int semflg);
    • 参数意义:
      • key:与共享内存的key类似,用于标识信号量集,通常与共享内存使用相同的ftok生成的key
      • nsems:指定信号量集中信号量的个数。
      • semflg:与shmgetshmflg类似,用于指定创建标志和权限。
    • 操作信号量使用semop函数。
    • 函数原型:int semop(int semid, struct sembuf *sops, unsigned nsops);
    • 参数意义:
      • semid:是semget函数返回的信号量集标识符。
      • sops:是一个指向struct sembuf结构数组的指针,struct sembuf结构定义了对信号量的操作,如sem_num指定操作哪个信号量,sem_op指定操作值(如-1表示等待信号量,1表示释放信号量),sem_flg指定操作标志。
      • nsops:指定struct sembuf结构数组中元素的个数。
  4. 数据访问完成后
    • 从进程地址空间分离共享内存,使用shmdt函数。
    • 函数原型:int shmdt(const void *shmaddr);
    • 参数意义:shmaddrshmat函数返回的共享内存连接地址。
    • 最后删除共享内存对象,使用shmctl函数。
    • 函数原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    • 参数意义:
      • shmid:共享内存标识符。
      • cmd:通常使用IPC_RMID表示删除共享内存对象。
      • buf:一般设为NULL。同样,对于信号量,使用完后也可以使用semctl函数删除信号量集,其函数原型和参数意义与shmctl类似,只是针对信号量相关操作。