1399元无头MacBook值不值得买?拆解风险与验机避坑指南
2026/9/18 2:52:46
要在 Linux 中使用 System V 共享内存,通常遵循以下“四步走”:
malloc一样,但这是内核管理的。shmgetshmat(Shared Memory Attach)shmdt(Shared Memory Detach)shmctl这是一个极其重要的概念,也是和管道最大的区别。
为了写代码,我们需要先认识这几个核心函数的参数。这部分比mkfifo复杂,涉及到一个新的概念:Key。
ftok—— 生成唯一标识符怎么让两个无关的进程(Server 和 Client)找到同一个共享内存呢?
我们需要一个算法,把一个文件路径和一个项目 ID 转换成一个唯一的数字 Key。
#include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);pathname:一个存在的文件路径(通常用当前目录.)。proj_id:一个整数(通常写个字符,如'a')。key_t,两端只要传入相同的路径和 ID,就能得到相同的 Key。shmget—— 创建共享内存#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);key:刚才ftok生成的那个 Key。size:申请多少字节?(建议是 4KB 的整数倍,因为操作系统按页分配内存,如果你申请 4097 字节,OS 实际会分配 8KB,但你只能用 4097)。shmflg:标志位和权限。IPC_CREAT:不存在就创建,存在就获取。IPC_EXCL:配合IPC_CREAT使用,如果存在则报错(用于确保我是第一个创建的)。0666。fd;失败返回 -1。shmat—— 挂接void *shmat(int shmid, const void *shmaddr, int shmflg);shmid:shmget返回的 ID。shmaddr:想挂载到虚拟内存的哪个地址?通常传NULL,让内核自己找个风水宝地。shmflg:读写模式,默认为 0(可读写)。void*),失败返回 -1。shmctl—— 控制/删除int shmctl(int shmid, int cmd, struct shmid_ds *buf);cmd:常用IPC_RMID(Remove ID),标记删除。IPC_RMID只是标记删除。只有当连接这块内存的所有进程都shmdt(断开)后,物理内存才会真正释放。