1. 前言

多进程,总有一些交互要做,不可能各自独立。

这里是最简单的例子。一个写入,一个读取。

一个建立共享内存,写入数据。

一个读取共享内存的内容。

2. 简单例子代码

twriter.cpp 代码如下:

#include

#include

#include

#include

#include

int main()

{

int shm_id;

int *share;

int num;

//1. 创建共享内存

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

//2. 获取共享内存在进程中的地址映射,以后可直接使用这个指针

share = (int *)shmat(shm_id, 0, 0);

while(1) {

num = random() % 1000;

//3. 直接向共享内存写入数据

*share = num;

printf("write a random number %d\n", num);

sleep(1);

}

return 0;

}

tread.cpp 代码如下:

#include

#include

#include

#include

#include

int main()

{

int shm_id;

int *share;

//1. 根据key=1234 创建或者获取共享内存

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

//2. 获取共享内存在此进程中的地址映射,以后这个指针直接指向共享内存

share = (int *)shmat(shm_id, 0, 0);

while(1) {

sleep(1);

//3. 直接使用共享内存的指针,获取里面的内容

printf("%d\n", *share);

}

return 0;

}

效果演示:

如图所示:两个进程,一个写数据,一个读数据,完成的很好。

很明显,功能已实现。

3. 共享结构体数据

重要的事情说三遍:

最核心的操作是内存复制!

最核心的操作是内存复制!

最核心的操作是内存复制!

尤其在接收端,必须要拷贝到本地的结构体中,本地化才行!!!

twriter.cpp  代码如下:

#include

#include

#include

#include

#include

#include

typedef struct

{

int i;

char ch[1];

float a;

}data, *dataprt;

int main()

{

data stu1;

stu1.i = 12;

stu1.ch[0] = 'a';

stu1.a = 1.2;

int shm_id;

dataprt share;

int num;

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

share = (dataprt)shmat(shm_id, 0, 0);

while(1) {

num = random() % 1000;

stu1.i = num;

stu1.ch[0] = 'x';

stu1.a = 12.6;

//*** 内存复制! 这是最核心的操作 ***

memcpy(share, &stu1, sizeof(stu1));

printf("write a share->i : %d\n", share->i);

printf("write a share->ch : %c\n", share->ch[0]);

printf("write a share->a : %f\n", share->a);

sleep(1);

}

return 0;

}

tread.cpp 代码如下:

#include

#include

#include

#include

#include

#include

typedef struct

{

int i;

char ch[1];

float a;

}data, *dataprt;

int main()

{

data sturead;

int shm_id;

dataprt share;

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

share = (dataprt)shmat(shm_id, 0, 0);

while(1) {

sleep(1);

//*** 最核心的操作,内存复制 ***

memcpy(&sturead, share, sizeof(sturead));

printf("i : %d\n", sturead.i);

printf("ch : %c\n", sturead.ch[0]);

printf("a : %f\n", sturead.a);

}

return 0;

}

效果如下:

下一步改进:

(1)不需要实时读取共享内容,需要等待信号通知,写完之后,才去读取。

---

linux进程内存结构体,Linux下网络编程(3)——进程间通信(IPC),共享内存,传递结构体数据...相关推荐

  1. 【Linux系统编程】进程间通信之共享内存

    00. 目录 文章目录 00. 目录 01. 共享内存概述 02. 共享内存函数 2.1 创建共享内存 2.2 共享内存映射 2.3 共享内存解除映射 2.4 共享内存操作函数 03. 案例实战 04 ...

  2. c语言编程基础之IPC共享内存

    共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化. 共享内存是进程间最快速的通信方式: `进程共享 ...

  3. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  4. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  5. 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程

    挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...

  6. [转]Linux 进程间通信:共享内存

    (上) 级别: 初级 郑彦兴 (mlinux@163.com), 国防科大攻读博士学位 2003 年 5 月 01 日 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B ...

  7. Linux(信号,进程间通信)共享内存,信号量,消息队列

    信号(signal) 1.1 什么是信号? 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 1.2 信号的来源 硬件 [1] 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程 ct ...

  8. Linux进程间通信(四) - 共享内存

    共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...

  9. Linux进程间通信:共享内存函数(shmget、shmat、shmdt、shmctl)及其范例

    共享内存函数由shmget.shmat.shmdt.shmctl四个函数组成.下面的表格列出了这四个函数的函数原型及其具体说明. 1.   shmget函数原型 shmget(得到一个共享内存标识符或 ...

  10. Linux进程间通信:共享内存mmap、xsi和posix

    前言 本文主要说明在Linux环境上如何使用共享内存.阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存? 如何使用POSIX ...

最新文章

  1. MySQL 数据库规范--开发篇
  2. 某厂商APT防御思路
  3. html5 建筑物模型,基于HTML5的建筑物阴影实时模拟
  4. OpenCASCADE绘制测试线束:拓扑命令之扫掠Sweeping
  5. 听说版本会说话,你相信吗?
  6. 前端技术-调试工具(上)
  7. 5元素升级android6,升级你的app以支持高长宽比的新旗舰
  8. golang 上下文 Context
  9. MDC功能软件-感知融合算法介绍
  10. android:ClassNotFoundException for Activity class的解决方法
  11. 请在微信客户端打开链接
  12. 淘宝订单导出到excel_将产品添加到Excel订单
  13. 解决MAC上Django连接Mysql django.db.utils.OperationalError: (2003, Can't connect to MySQL 的问题
  14. AidLux“换脸”案例源码详解 (Python)
  15. SQL协同Excel制表统计各学院一二三等奖
  16. 计算机cpu基本功能,cpu的基本功能包括
  17. 免费亚马逊云服务器AWS EC2使用流量查看
  18. Cordova各种事件
  19. IAP 与 STC 的区别
  20. 【我的渲染技术进阶之旅】你可能永远猜不到为什么Filament项目命名为TNT?

热门文章

  1. MySQL 8 复制(六)——拓扑与性能
  2. sonoff开关改装件控制(3) ------flutter导入其他安卓项目的依赖包
  3. Redis命令详解:Pub/Sub
  4. 走近源码:Redis命令执行过程(客户端)
  5. rc振荡器振荡频率计算_微控制器中的振荡器频率
  6. 2022-3-30 Leetcode 1133.最大唯一数
  7. 【Flink基础】-- Flink CDC介绍
  8. 珠三角技术沙龙第 4 期总结(含照片、ppt 和视频)
  9. Gamma 函数及其应用
  10. linux 6 telnet目录,在linux6.8安装telnet服务