共享内存通讯编程

来源:互联网 发布:经典算法 java 例子 编辑:程序博客网 时间:2024/04/30 06:47

共享内存是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);}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子挑衣服穿怎么办 馒头店生意不好怎么办 白连裤袜染色了怎么办 人比较胖校服怎么办 幼儿撕书老师怎么办 夏天面试要求穿正装怎么办 面试要求穿正装没有怎么办 面试没有正装怎么办 退烧药服用过量怎么办 小孩喝洗衣粉水怎么办 小孩误食沐浴露怎么办 三个月宝宝腿弯怎么办 宝宝背带裤老掉怎么办 羽绒服洗完结块怎么办 天猫保证金被骗怎么办 飞机杯发霉了怎么办 背带裤裆太大了怎么办 宝宝开裆裤裆太大怎么办 a字裙太大怎么办 棉衣服缩水了怎么办 百褶裙子大了怎么办 皮鞋有黑色划痕怎么办 天猫搜索不了怎么办 帆布鞋穿着脚臭怎么办 运动鞋磨脚踝骨怎么办 运动鞋挂烂了怎么办 网状运动鞋烂了怎么办 运动鞋臭怎么办快速去除 天猫预售退货怎么办 肯德基兑换券过期了怎么办 直通车上10之后怎么办 淘宝没有评论过怎么办 爱上街虚假发货怎么办 天猫差评被置顶了一天怎么办 天猫跨店满减其中订单退款怎么办 天猫618津贴不够怎么办 鼻子上长大包怎么办 净水器滤芯漏水怎么办 京东忘记用户名怎么办 详情页图片模糊怎么办 打印图片字体模糊怎么办