美文网首页
Linux 进程间通信 -- 匿名mmap映射

Linux 进程间通信 -- 匿名mmap映射

作者: brownfeng | 来源:发表于2020-02-04 09:31 被阅读0次

    Linux 匿名 mmap

    匿名映射:

    #include <sys/mman.h>
    void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
    int munmap(void *addr, size_t length);
    

    在调用mmap函数时候,在flags参数那里,设置MAP_ANON,并在fd参数那里设置-1.

    因为没有实体文件, 匿名映射不能实现无血缘关系的进程间通通信. 下面是一个父子通信,并且使用struct进程内存映射的实例:

    #include <fcntl.h>
    #include <stdio.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    
    typedef struct _person {
      char name[128];
      int age;
    } Person;
    
    int main() {
    
      int length = sizeof(Person);
      Person *person = (Person *)mmap(NULL, length, PROT_READ | PROT_WRITE,
                                      MAP_SHARED | MAP_ANON, -1, 0);
      if (person == MAP_FAILED) {
        perror("mmap");
        return -1;
      }
      pid_t pid = fork();
    
      if (pid == 0) {
        sprintf(person->name, "brownfeng");
        person->age = 18;
        printf("child:person.name=%s, person.age=%d\n", person->name, person->age);
        sleep(3);
        printf("child:person.name=%s, person.age=%d\n", person->name, person->age);
      } else if (pid > 0) {
        sleep(1);
        printf("parent:person.name=%s, person.age=%d\n", person->name, person->age);
        sprintf(person->name, "brownfeng -- change");
        person->age = 100;
        printf("parent:person.name=%s, person.age=%d\n", person->name, person->age);
        wait(NULL);
      }
    
      munmap(person, sizeof(person));
      return 0;
    }
    

    相关文章

      网友评论

          本文标题:Linux 进程间通信 -- 匿名mmap映射

          本文链接:https://www.haomeiwen.com/subject/fvnlxhtx.html