zoukankan      html  css  js  c++  java
  • 共享内存通讯编程

    共享内存是IPC机制中的一种。它同意两个不相关的进程訪问同一段内存,这是传递数据的一种很有效的方式。

    shmget函数

    原型:int shmget(key_t key,size_t size,int shmflg)
    头文件:<sys/ipc.h><sys/shm.h>
    功能:创建/获取一个共享内存。成功则返回共享内存的描写叙述符id,失败返回-1
    參数:key:键值
         size:创建的共享内存大小
         shmflg:打开标志。

    如值为IPC_CREAT,则会创建一个新的共享内存

    shmget函数创建的共享内存返回的是其描写叙述符id,要想使用该共享内存,还须要将创建的共享内存映射到调用该函数的进程的内存空间,使用的函数为shmat。

    shmat函数

    原型:void *shmat(int shmid,const void *shmaddr,int shmflg)
    头文件:<sys/types.h><sys/shm.h>
    功能:将共享内存连接到调用该函数的进程的地址空间,成功返回映射后的地址。失败返回-1
    參数:shmid:共享内存的描写叙述符
         shmaddr:能够使用该參数来指定映射的地址,但一般设为NULL。让操作系统选择一块没有使用的内存地址来进行映射
         shmflg:状态标志

    shmdt函数

    原型:int shmdt(const void *shmaddr)
    头文件:<sys/types.h><sys/shm.h>
    功能:与shmat对立,用来脱离与共享内存的连接映射。

    成功返回0。失败返回-1 參数:shmaddr:须要与共享内存脱离映射的进程内存地址

    shmctl

    原型:int shmctl(int shmid,int cmd,struct shmid_ds *buf)
    头文件:<sys/ipc.h><sys/shm.h>
    功能:依据cmd的值对共享内存进行不同的操作。操作失败返回-1
    參数:shmid:共享内存描写叙述符id
         cmd:操作命令。如为IPC_RMID,则表示删除共享内存。

    buf:在Linux系统中每一个共享内存都有一个struct shmid_ds来相应描写叙述该共享内存。shmctl函数中buf用于获取Linux描写叙述该贡献内存的struct shmid_ds。可是一般不使用

    实例

    进程A:创建共享内存并映射到自己进程的内存地址,然后往共享内存写入数据。写完后断开映射。

    #include<sys/ipc.h>
    #include<sys/shm.h>
    #include<sys/types.h>
    #include<stdio.h>
    #include<string.h>
    typedef struct
    {
        int mem_flg;
        char buff[1024];    
    }shared_mem,*shared_mem_ptr;
    void main()
    {
        /*创建共享内存*/
        key_t key=ftok("/home/jx/processA",1);
        int shmid=shmget(key,sizeof(shared_mem),IPC_CREAT);
        /*映射共享内存*/
        shared_mem_ptr shm_ptr;
        shm_ptr=(shared_mem_ptr)shmat(shmid,NULL,0);
        shm_ptr->mem_flg=0;
        /*往共享内存写入数据*/
        int running=1;
        while(running)
        {
            if(shm_ptr->mem_flg==0)
            {
                scanf("%s",shm_ptr->buff);
                shm_ptr->mem_flg=1;
                int a=strcmp(shm_ptr->buff,"exit");
                if(a==0)
                    running=0;
            }
        }
        /*断开映射*/
        shmdt((const void*)shm_ptr);
    }

    进程B:获取共享内存并映射到自己进程的内存地址,读取共享内存的数据。读取完断开与共享内存的映射并删除共享内存。

    #include<sys/ipc.h>
    #include<sys/shm.h>
    #include<sys/types.h>
    #include<stdio.h>
    #include<string.h>
    typedef struct
    {
        int mem_flg;
        char buff[1024];    
    }shared_mem,*shared_mem_ptr;
    void main()
    {
        /*获取共享内存*/
        key_t key=ftok("/home/jx/processA",1);
        int shmid=shmget(key,sizeof(shared_mem),IPC_CREAT);
        /*映射共享内存*/
        shared_mem_ptr shm_ptr;
        shm_ptr=(shared_mem_ptr)shmat(shmid,NULL,0);
        /*读取共享内存数据*/
        int running=1;
        while(running)
        {
            if(shm_ptr->mem_flg==1)
                {
                    printf("%s
    ",shm_ptr->buff);   
                    shm_ptr->mem_flg=0;
                    int a=strcmp(shm_ptr->buff,"exit");
                    if(a==0)
                        running=0;
                }
        }
        /*断开映射*/
        shmdt((const void*)shm_ptr);
        /*删除共享内存*/
        struct shmid_ds *buf;
        shmctl(shmid,IPC_RMID,buf);
    }
  • 相关阅读:
    iOS图片压缩上传
    Spring MVC获得HttpServletRequest
    BZOJ 1002 FJOI2007 轮状病毒 递推+高精度
    破解2559
    Redis源代码分析(十七)--- multi事务操作
    Android setTag()与getTag(),与set多个setTag()
    【NOI2015】【程序自己主动分析】【并查集+离散化】
    BZOJ1433 [ZJOI2009]假期的宿舍
    将參数从PHP传递到JavaScript中
    NUTCH2.3 hadoop2.7.1 hbase1.0.1.1 solr5.2.1部署(二)
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7232495.html
Copyright © 2011-2022 走看看