MST

星途 面试题库

面试题:C语言中共享内存的基本原理及简单使用

在Linux环境下,简述C语言共享内存的基本原理。请写出一段简单的C语言代码示例,用于创建共享内存并将一个整数写入共享内存,同时说明需要包含哪些头文件。
34.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

共享内存基本原理

共享内存是一种在多个进程之间共享数据的高效方式。在Linux系统中,它允许不同进程将同一段物理内存映射到各自的地址空间中。这样,不同进程可以直接读写这段共享区域,实现数据的快速交换,避免了像管道或消息队列那样的额外数据拷贝开销。内核为共享内存段维护相关的控制结构,进程通过系统调用获取共享内存段的标识符,然后将其映射到自身地址空间,从而实现对共享内存的访问。

代码示例

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

#define SHM_SIZE 1024

int main() {
    key_t key;
    int shmid;
    int *shared_mem;

    // 生成一个唯一的键值
    key = ftok(".", 'a');
    if (key == -1) {
        perror("ftok");
        return 1;
    }

    // 创建共享内存段
    shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
    if (shmid == -1) {
        perror("shmget");
        return 1;
    }

    // 将共享内存段映射到进程的地址空间
    shared_mem = (int *)shmat(shmid, NULL, 0);
    if (shared_mem == (void *)-1) {
        perror("shmat");
        return 1;
    }

    // 向共享内存写入一个整数
    *shared_mem = 42;

    printf("写入共享内存的值为: %d\n", *shared_mem);

    // 分离共享内存段
    if (shmdt(shared_mem) == -1) {
        perror("shmdt");
        return 1;
    }

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

    return 0;
}

头文件说明

  • stdio.h:提供标准输入输出函数,如printf
  • stdlib.h:包含常用的标准库函数,如exit等。
  • sys/types.h:定义了一些基本系统数据类型,如key_t
  • sys/ipc.h:提供用于进程间通信(IPC)的函数和定义,如ftokshmget用到的相关定义。
  • sys/shm.h:提供共享内存相关的函数和定义,如shmatshmdtshmctl等函数的声明。
  • unistd.h:提供POSIX操作系统API的函数声明,如perror等。