码迷,mamicode.com
首页 > 其他好文 > 详细

共享内存通讯编程

时间:2015-08-10 18:07:11      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:函数   通讯   编程   

共享内存是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\n",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);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

共享内存通讯编程

标签:函数   通讯   编程   

原文地址:http://blog.csdn.net/u011012049/article/details/47401981

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!