linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步

本文介绍了如何在Linux中利用mmap创建共享内存,并通过sem_t信号量实现父子进程的互斥访问。首先创建文件并映射到内存,将sem_t置于内存起始位置用于同步。接着创建子进程,父子进程通过sem_wait和sem_post进行同步操作,确保安全访问共享内存。最后,介绍如何使用munmap取消映射。结构体的巧妙设计使得数据访问更为便捷。
摘要由CSDN通过智能技术生成


1.创建文件。open,ftruncate

2.将文件映射到内存。内存首地址存放一个sem_t实现进程的互斥。mmap,sem_init

3.创建子进程。父子进程互斥地访问共享内存的内容。fork,sem_wait,sem_post

4.取消映射。munmap


由于需要同步或者互斥,因此需要sem_t,我们把他放在内存区的开头,那么真正可用的内存就是开头做一定偏移。维护一个指针,使指针

指向实际数据区。就定义一个结构体:

struct file_content
{
    sem_t st;
    void *pv;
} file_content;

初始化时:

 pfc->pv = (void *) ((char *) pfc + sizeof (struct file_content));     // pv指向结构体下一个字节的地址

这样,st就是sem_t信号量。pv就是数据指针,比较方便!

另外,sem_t初始化时第二个参数设为1,表示用于进程间而不限于进程间的访问。

#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#inc
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值