zoukankan      html  css  js  c++  java
  • Posix 共享内存区

    要点

    与mmap配合使用
    open与shm_open的区别,open打开磁盘上的普通文件,shm_open创建和打开的文件在/dev/shm文件夹下,该文件夹对应的是内存
    gcc编译时加参数-lrt
    shm_open的第一个参数名字的形式: /name, 如"/myshm"

    基本函数

    #include <sys/mman.h>
    int shm_open(const char *name, int oflag, mode_t mode);
    int shm_unlink(const char *name);
     
    #include <unistd.h>
    int ftruncate(int fd, off_t length);
     
    #include <sys/types.h>
    #include <sys/stat.h>
    int fstat(int fd,struct stat *buf);
    struct stat{
        ...
        mode_t st_mode;
        off_t st_size;
        ...
    };
    

    shm_open用于创建或打开内存文件
    shm_unlink用于删除内存文件的名字,并不影响已经打开的进程
    ftruncate用于调整内存文件的大小
    fstat用于获取文件的属性

    例子

    用open和shm_open两种方式创建内存共享区;打印父子进程中两个共享区的内存地址

    #include "unpipc.h"
    #include <sys/stat.h>
    #include <sys/mman.h>
     
    int main(int argc, char *argv[]){
        int fd1,fd2,*ptr1,*ptr2;
        pid_t childpid;
        struct stat st;
     
        if(argc != 2)
            err_quit("usage: ./shm <name>");
        shm_unlink(argv[1]);
        fd1=shm_open(argv[1],O_RDWR|O_CREAT|O_EXCL,0644);
        ftruncate(fd1,sizeof(int));
        fd2=Open("./shm.c",O_RDONLY,0);
        fstat(fd2,&st);
     
        if((childpid=Fork()) == 0){
            ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
            ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
            printf("child: shm ptr=%p, shm.c ptr=%p
    ",ptr1,ptr2);
            sleep(5);
            printf("shared memory integer=%d
    ",*ptr1);
            exit(0);
        }
     
        ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
        ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
        printf("father: shm ptr=%p, shm.c ptr=%p
    ",ptr1,ptr2);
        *ptr1=777;
        waitpid(childpid,NULL,0);
     
        exit(0);
    }
    
  • 相关阅读:
    rpc的几种服务端模型分析
    ASP.NET MVC3在Visual Studio 2010中的变化
    HTML元素的ID和Name属性的区别
    Oracle日期类操作(格式 加减乘 取毫秒)
    快速原型工具
    C#4.0新特性dynamic\可选参数、命名参数
    WCF注册Windows Service
    不要在using语句中调用WCF服务
    C# 4.0 新特性dynamic、可选参数、命名参数等
    Windows内置系统账户Local system/Network service/Local Service
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5836252.html
Copyright © 2011-2022 走看看