[国嵌攻略][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;         //共享标志
    char data[SIZE];   //共享数据
}ShareMem;

void main(){
    //创建共享内存
    int key;
    int shmid;

    key = ftok("./", 0);
    shmid = shmget(key, sizeof(ShareMem), IPC_CREAT);

    //映射共享内存
    ShareMem *shareMem;

    shareMem = (ShareMem *)shmat(shmid, NULL, 0);

    //设置共享内存
    shareMem->flag = 0;

    while(1){
        //判断共享标志
        while(shareMem->flag != 0);

        //获取用户输入
        char buffer[SIZE];

        fgets(buffer, SIZE, stdin);

        //写入共享内存
        strncpy(shareMem->data, buffer, SIZE);
        shareMem->flag = 1;

        //判断是否退出
        if(strncmp(buffer, "quit", 4) == 0){
            break;
        }
    }

    //脱离共享内存
    shmdt((const void *)shareMem);
}

B.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;         //共享标志
    char data[SIZE];   //共享数据
}ShareMem;

void main(){
    //打开共享内存
    int key;
    int shmid;

    key = ftok("./", 0);
    shmid = shmget(key, sizeof(ShareMem), IPC_CREAT);

    //映射共享内存
    ShareMem *shareMem;

    shareMem = (ShareMem *)shmat(shmid, NULL, 0);

    //设置共享内存
    shareMem->flag = 1;

    while(1){
        //判断共享标志
        while(shareMem->flag != 1);

        //读取共享内存
        char buffer[SIZE];

        strncpy(buffer, shareMem->data, SIZE);
        shareMem->flag = 0;

        //显示共享内存
        printf("%s", buffer);

        //判断是否退出
        if(strncmp(buffer, "quit", 4) == 0){
            break;
        }
    }

    //脱离共享内存
    shmdt((const void *)shareMem);

    //删除共享内存
    shmctl(shmid, IPC_RMID, NULL);
}
时间: 2024-11-01 09:40:51

[国嵌攻略][085][共享内存通讯]的相关文章

[国嵌攻略][080][无名管道通讯]

通讯目的 1.数据传输 一个进程需要将数据发送给另外一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另外一个/组进程发送消息,通知它们发生了某事件. 4.进程控制 有些进程希望完全控制另外一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有操作,并能够及时知道它的状态改变. 通信方式 1.无名管道(pipe):数据传输 2.有名管道(fifo):数据传输 3.信号(signal):通知事件 4.消息队列 5.内存共享 6.信号量:资源共享 7.套接字(s

[国嵌攻略][081][有名管道通讯]

有名管道 有名管道又称为FIFO文件,因此我们对有名管道的操作可以采用文件操作的方法,如使用open,read,write等. FIFO文件的特点 1.读取FIFO文件的进程只能以RDONLY方式打开FIFO文件. 2.写入FIFO文件的进程只能以WRONLY方式打开FIFO文件. 3.FIFO文件里面的内容被读取后就消失了,但普通文件里面的内容被读取后还存在. wFIFO.c #include <sys/types.h> #include <sys/stat.h> #includ

[国嵌攻略][070-095][Linux编程函数手册]

第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 <time.h> 1.1.5 返回值 成功:日历时间失败:-1 1.1.6 参数说明 t:不为空的情况下保存返回值   1.2 获取格林威治时间 1.2.1 函数名 gmtime 1.2.2 函数原形 struct tm *gmtime(const time_t *timep) 1.2.3 函数功

[国嵌攻略][039][我从内部看内存]

内存分类 1.DRAM(动态RAM) 它的基本原件是小电容,电容可以在两极板上保留电荷,但是需要定期的刷新,否则数据会丢失.缺点是由于要定期刷新存储介质,存取速度较慢 DRAM分类: 1.1.SDRAM 同步动态随机存储器 同步:内存工作时需要有同步时钟,内部的命令的发送与数据的传输都是以该时钟为基准的 动态:存储阵列需要不断的刷新来保证数据不丢失 随机:是指数据不是线性依次存储,而是自由指定地址进行数据读写 1.2.DDR(Double Data Rate SDRAM双倍速率同步动态随机存储器

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][073][静态函数库设计]

外部函数 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别 系统调用在Linux内核中位于核心态,而函数库是由工程师提供位于用户态 函数库分类 函数库按照链接方式可以分为静态函数库和动态函数库 存放位置 Linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中以*.so.*方式命名的是动态函数库,而以*.a方式命名的是静态函数库. 静态链接库的特点 程序所要用到的库函数代码在链接时全部被拷贝到程序中.如果有多个进程在内存中同时运行,并且使用了

[国嵌攻略][060][LCD工作原理解析]

LCD硬件体系 1.LCD液晶屏 液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会有规律旋转,这样对光线产生一定的控制形成一个像素,而很多像素右可以构成完整的图像. LCD是Liquid Crystal Display的简称.液晶显示器按驱动方式可以分为TFT.GF.STN等种类,其中TFT屏在嵌入式系统中经常使用. 2.LCD驱动芯片 LCD驱动芯片是控制液晶分子发生变化的模块,它为液晶分子的偏转提供电压.通常情况下,LCD驱动芯片都与液晶屏面板做到一块电路板上. 3.LC

[国嵌攻略][161][USB总线介绍]

USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft等多家公司联合提出的.自1996年堆出后,已经成功替代了串口和并口.成为当今个人电脑和大量智能设备的必备接口之一. USB1.0出现在1996年,速度只有1.5Mbps.1998年升级为USB1.1,速度也提升到了12Mbps,称之为full speed. USB2.0规范是由USB1.1规范演变而

[国嵌攻略][087][多线程程序设计]

线程概念 1.线程就是轻量级的进程. 2.线程与创建它的进程共享代码段和数据段. 3.线程拥有自己独立的栈. 线程特点 线程可以和进程做相同或不同的工作,但是与进程共享资源. 线程互斥 在实际应用中,多个线程往往会访问同一个数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)互斥机制就是其中一种. thread.c #include <pthread.h> #include <stdio.h> #include <unistd.h> pthr