三、mmap不同进程间通信

1.不同进程间通信

1.1 写进程:
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
struct Person {
    int age;
    char name[256];
};
int main() {
    printf("write process");
    Person pa = {1, "heyan"};
    Person *pb;
    int fd = open("mmap.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        printf("open mmap.txt filed");
        exit(1);
    }
    printf("open mmap.txt success\n");
    //扩充文件大小,否则mmap读时会发生总线错误
    ftruncate(fd, sizeof(Person));
    pb = (static_cast<Person *>(mmap(NULL, sizeof(Person),  PROT_WRITE, MAP_SHARED, fd, 0)));
    if (pb == MAP_FAILED) {
        printf("mmap open failed\n");
        exit(1);
    }
    close(fd);
    printf("mmap open success\n");
    int i = 0;
    while (i<11) {
        printf("write\n");
        memcpy(pb, &pa, sizeof(Person));
        pa.age++;
        sleep(1);
        i++;
    }
    munmap(pb, sizeof(Person));
    return 0;
}

1.2 读进程:
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <iostream>
struct Person {
    int age;
    char name[256];
};

int main() {
    printf("read process");
    Person pa;
    Person *pb;
    int fd = open("mmap.txt", O_RDONLY, 0644);
    if (fd == -1) {
        printf("open mmap.txt filed");
        exit(1);
    }
    printf("open mmap.txt success\n");
    //扩充文件大小,否则mmap读时会发生总线错误
    pb = (static_cast<Person *>(mmap(NULL, sizeof(pa), PROT_READ, MAP_SHARED, fd, 0)));
    if (pb == MAP_FAILED) {
        printf("mmap open failed\n");
        exit(1);
    }
    close(fd);
    printf("mmap open success");
    int i = 0;
    while (i < 11) {
        printf("age = %d  name = %s\n", pb->age, pb->name);
        sleep(1);
        i++;
    }
    munmap(pb, sizeof(pa));
    return 0;
}

写进程先运行,运行结果:

write processopen mmap.txt success
mmap open success
write
write
write
write
write
write
write
write
write
write
write

读进程结果:

age = 5  name = heyan
age = 6  name = heyan
age = 7  name = heyan
age = 8  name = heyan
age = 9  name = heyan
age = 10  name = heyan
age = 11  name = heyan
age = 11  name = heyan
age = 11  name = heyan
age = 11  name = heyan

写进程先开始,会覆盖之前的数据,在读时就不是从1开始了。所以读到的结果是从5开始,因为读进程又是后结束,所以杜金城会读到11几次,因为11是写进程最后写入的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值