MST
星途 面试题库

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

请简述在Linux环境下,C语言中共享内存的基本原理。并编写一段简单的C语言代码示例,实现两个进程通过共享内存进行数据传递,比如传递一个整数。
13.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

共享内存基本原理

共享内存是一种在多个进程之间共享一块物理内存区域的机制。在Linux系统中,它由内核进行管理。不同进程通过将这段共享内存映射到各自的虚拟地址空间,从而可以直接读写这块内存区域,实现进程间高效的数据共享和通信。相比其他进程间通信(IPC)方式,如管道、消息队列等,共享内存不需要在内核态和用户态之间频繁拷贝数据,因此具有更高的效率。

代码示例

#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;
    pid_t pid;

    // 生成一个唯一的键值
    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;
    }

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    } else if (pid == 0) { // 子进程
        // 子进程向共享内存写入数据
        *shared_mem = 42;
        printf("子进程写入数据: %d\n", *shared_mem);
        // 分离共享内存
        if (shmdt(shared_mem) == -1) {
            perror("shmdt in child");
            return 1;
        }
    } else { // 父进程
        // 等待子进程完成写入
        wait(NULL);
        // 父进程从共享内存读取数据
        printf("父进程读取数据: %d\n", *shared_mem);
        // 分离共享内存
        if (shmdt(shared_mem) == -1) {
            perror("shmdt in parent");
            return 1;
        }
        // 删除共享内存段
        if (shmctl(shmid, IPC_RMID, NULL) == -1) {
            perror("shmctl");
            return 1;
        }
    }

    return 0;
}