共享内存通讯编程

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

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

时间: 2024-10-11 01:08:07

共享内存通讯编程的相关文章

linux_c开发(5-4)进程间通讯_共享内存通讯

共享内存 共享内存 是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快方法,一个进程向共享内存写入了数据,共享这个内存的所有进程就可以立刻看到其中内容. 共享内存实现分为两个步骤 1.创建共享内存,使用shmget函数. 2.映射共享内存,将创建的这段共享内存映射到具体的进程空间去,使用shmat函数. int shmget(key_t key,int size,int shmflg) key标志共享内存的键值:O/IPC_PRIVATE.当key的取值为IPC/PRIVATE

共享内存通讯

1.核心理论 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式. 2.函数学习 创建/获取共享内存 函数名:shmget 函数原型:int shmget(key_t key,size_t size,int shmflg) 函数功能:创建或者获取共享内存,并返回其描述符 头文件:<sys/ipc.h> <sys/shm.h> 返回值:成功:返回创建或获取到的共享内存的描述符 失败:-1 参数说明:key:共享内存的键值 size:共

[国嵌攻略][085][共享内存通讯]

共享内存 共享内存是IPC机制中的一种,它允许两个相关的进程访问同一段内存,这是传递数据的一种有效的方式. A.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <string.h> #define SIZE 2048 typedef struct sharemem{ int flag; //共享标志 cha

【转】Linux共享内存编程实例

原文地址:http://blog.csdn.net/pcliuguangtao/article/details/6526119 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6

信号量学习 &amp; 共享内存同步

刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现在就学习信号量咯. 共享内存实际编程中, 应该使用信号量, 或通过传递消息(使用管道或IPC消息), 或生成信号 的方法来提供读写之间的更有效的同步机制. 方法一.利用POSIX有名信号灯实现共享内存的同步 方法二.利用POSIX无名信号灯实现共享内存的同步 方法三.利用System V的信号灯实现

Linux进程间通信 共享内存+信号量+简单例子

每一个进程都有着自己独立的地址空间,比如程序之前申请了一块内存,当调用fork函数之后,父进程和子进程所使用的是不同的内存.因此进程间的通信,不像线程间通信那么简单.但是共享内存编程接口可以让一个进程使用一个公共的内存区段,这样我们便能轻易的实现进程间的通信了(当然对于此内存区段的访问还是要控制好的). 共享内存实现进程通信的优点: 共享内存是进程通信方式中最快速的方式之一,它的快速体现在,为数据共享而进行的复制非常少.这里举例来说,使用消息队列时,一个进程向消息队列写入消息时,这里有一次数据的

Linux进程间通信 共享内存+信号量+简单样例

每个进程都有着自己独立的地址空间,比方程序之前申请了一块内存.当调用fork函数之后.父进程和子进程所使用的是不同的内存. 因此进程间的通信,不像线程间通信那么简单.可是共享内存编程接口能够让一个进程使用一个公共的内存区段,这样我们便能轻易的实现进程间的通信了(当然对于此内存区段的訪问还是要控制好的). 共享内存实现进程通信的长处: 共享内存是进程通信方式中最高速的方式之中的一个,它的高速体如今,为数据共享而进行的复制很少.这里举例来说.使用消息队列时.一个进程向消息队列写入消息时.这里有一次数

Linux环境编程之共享内存区(一):共享内存区简介

Spark生态圈,也就是BDAS(伯克利数据分析栈),是伯克利APMLab实验室精心打造的,力图在算法(Algorithms).机器(Machines).人(People)之间通过大规模集成,来展现大数据应用的一个平台,其核心引擎就是Spark,其计算基础是弹性分布式数据集,也就是RDD.通过Spark生态圈,AMPLab运用大数据.云计算.通信等各种资源,以及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为有用的信息,以供人们更好的理解世界.Spark生态圈已经涉及到机器学习.数据挖掘.

win32进程间通讯--共享内存

小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 1 hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)szName); 2.在需要进行数据共享的地方映射缓存区视图,将要写入的数据放入pbuf 1 pBuf = (c