面试题答案
一键面试共享内存基本原理
共享内存是一种在多个进程之间共享一块物理内存区域的机制。在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;
}