MST

星途 面试题库

面试题:C语言中如何在Linux环境下销毁共享内存

请描述在Linux系统中,使用C语言销毁共享内存的基本步骤,并给出关键函数及其参数的简要说明。
14.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 获取共享内存标识符
    • 使用 shmat() 函数将共享内存段连接到进程的地址空间。
    • 函数原型:void *shmat(int shmid, const void *shmaddr, int shmflg);
      • shmid:共享内存标识符,由 shmget() 函数返回。
      • shmaddr:指定共享内存连接到进程中的地址,通常设为 NULL,表示让系统自动选择一个合适的地址。
      • shmflg:一组标志位,例如 SHM_RDONLY 表示以只读方式连接共享内存,通常为0以读写方式连接。
  2. 解除共享内存连接
    • 使用 shmdt() 函数来解除共享内存段与进程地址空间的连接。
    • 函数原型:int shmdt(const void *shmaddr);
      • shmaddr:是之前 shmat() 函数返回的共享内存地址。
  3. 销毁共享内存
    • 使用 shmctl() 函数销毁共享内存段。
    • 函数原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
      • shmid:共享内存标识符。
      • cmd:操作命令,这里使用 IPC_RMID 来标记要销毁共享内存。
      • buf:指向一个 struct shmid_ds 结构体的指针,当 cmdIPC_RMID 时,该参数可以设为 NULL

示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024

int main() {
    key_t key;
    int shmid;
    char *shmaddr;

    // 获取key
    key = ftok(".", 'a');
    if (key == -1) {
        perror("ftok");
        return 1;
    }

    // 获取共享内存标识符
    shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);
    if (shmid == -1) {
        perror("shmget");
        return 1;
    }

    // 连接共享内存到进程地址空间
    shmaddr = (char *)shmat(shmid, NULL, 0);
    if (shmaddr == (void *)-1) {
        perror("shmat");
        return 1;
    }

    // 解除共享内存连接
    if (shmdt(shmaddr) == -1) {
        perror("shmdt");
        return 1;
    }

    // 销毁共享内存
    if (shmctl(shmid, IPC_RMID, NULL) == -1) {
        perror("shmctl");
        return 1;
    }

    printf("共享内存已销毁\n");
    return 0;
}