c_cpp Linux下IPC通信之共享映射区mmap示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp Linux下IPC通信之共享映射区mmap示例相关的知识,希望对你有一定的参考价值。

//父子进程间通信
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    //1. 先创建映射区
    int fd = open("mem.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
    if(fd < 0){
        perror("open err");
        exit(1);
    }
    //拓展文件大小
    truncate("mem.txt",4);
    int *mem = mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    //int *mem = mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);
    if(mem == MAP_FAILED){
        perror("mmap err");
        exit(1);
    }
    //2. fork子进程
    pid_t pid = fork();
    //3. 父子进程交替改映射区内容
    if(pid == 0){
        //子进程
        *mem = 100;
        sleep(2);
        printf("child,mem is %d\n",*mem);

    }else if(pid > 0){
        //父进程
        sleep(1);//父进程先睡觉等待子进程修改内存
        printf("parent,mem is %d\n",*mem);
        *mem = 200;
    }
    //4. 关闭映射区
    if(munmap(mem,4) < 0 ){
        perror("munmap err");
        exit(1);
    }
    //5. 关闭文件描述符
    close(fd);
    return 0;
}
//无血缘关系进程间通信
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

struct student {

    int sid;//学号
    char sname[20];//学生名字
};


int main(int argc,char *argv[])
{
    if(argc !=2 ){
        printf("./a.out filename\n");
        return -1;
    }
    //1. 打开文件 获得fd
    int fd = open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0666);
    if(fd < 0){
        perror("open file err");
        exit(1);
    }
    truncate(argv[1],sizeof(struct student));//拓展文件大小为结构体大小
    //2. 建立映射区 SHARED
    struct student *ps = mmap(NULL,sizeof(struct student),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if(ps == MAP_FAILED){
        perror("mmap err");
        exit(1);
    }
    int num = 1000;
    //3. 写数据
    while(1){
        ps->sid = num;//设置学号
        sprintf(ps->sname,"xiaoming-%04d",num++);//设置名字
        sleep(1);
    }
    //4. 关闭文件
    close(fd);
    //5. 释放映射区
    if(munmap(ps,sizeof(struct student)) < 0){
        perror("munmap err");
        return -1;
    }
    return 0;
}
//无血缘关系进程间通信
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

struct student {
    int sid;
    char sname[20];
};

int main(int argc ,char *argv[])
{
    if(argc != 2){
        printf("./a.out filename");
        exit(1);
    }
    //1 打开文件
    int fd = open(argv[1],O_RDWR);
    if(fd < 0 ){
        perror("open err");
        exit(1);
    }
    //2 建立映射区
    struct student *ps = mmap(NULL,sizeof(struct student),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if(ps == MAP_FAILED){
        perror("mmap err");
        exit(1);
    }
    //3 读数据
    while(1){
        printf("sid:%d,sname:%s\n",ps->sid,ps->sname);
        sleep(1);
    }
    //4. 关闭文件
    close(fd);
    //5. 释放映射区
    if(munmap(ps,sizeof(struct student)) < 0){
        perror("munmap err");
        return -1;
    }
    return 0;
}

以上是关于c_cpp Linux下IPC通信之共享映射区mmap示例的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp Linux下IPC通信之有名管道fifo示例

Linux环境编程之共享内存区:共享内存区简单介绍

Linux系统编程 --进程间通信 -共享内存

linux进程间通信之Posix共享内存用法详解及代码举例

c_cpp Linux的下IPC通信之本地套接字

UNIX网络编程:共享内存区