面试题答案
一键面试共享内存基本原理
共享内存是一种在多个进程之间共享数据的高效方式。在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)的函数和定义,如ftok
和shmget
用到的相关定义。sys/shm.h
:提供共享内存相关的函数和定义,如shmat
、shmdt
、shmctl
等函数的声明。unistd.h
:提供POSIX操作系统API的函数声明,如perror
等。