linux进程内存结构体,Linux下网络编程(3)——进程间通信(IPC),共享内存,传递结构体数据...
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),共享内存,传递结构体数据...相关推荐
- 【Linux系统编程】进程间通信之共享内存
00. 目录 文章目录 00. 目录 01. 共享内存概述 02. 共享内存函数 2.1 创建共享内存 2.2 共享内存映射 2.3 共享内存解除映射 2.4 共享内存操作函数 03. 案例实战 04 ...
- c语言编程基础之IPC共享内存
共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化. 共享内存是进程间最快速的通信方式: `进程共享 ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- Linux下网络编程
Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...
- 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程
挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...
- [转]Linux 进程间通信:共享内存
(上) 级别: 初级 郑彦兴 (mlinux@163.com), 国防科大攻读博士学位 2003 年 5 月 01 日 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B ...
- Linux(信号,进程间通信)共享内存,信号量,消息队列
信号(signal) 1.1 什么是信号? 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 1.2 信号的来源 硬件 [1] 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程 ct ...
- Linux进程间通信(四) - 共享内存
共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...
- Linux进程间通信:共享内存函数(shmget、shmat、shmdt、shmctl)及其范例
共享内存函数由shmget.shmat.shmdt.shmctl四个函数组成.下面的表格列出了这四个函数的函数原型及其具体说明. 1. shmget函数原型 shmget(得到一个共享内存标识符或 ...
- Linux进程间通信:共享内存mmap、xsi和posix
前言 本文主要说明在Linux环境上如何使用共享内存.阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存? 如何使用POSIX ...
最新文章
- MySQL 数据库规范--开发篇
- 某厂商APT防御思路
- html5 建筑物模型,基于HTML5的建筑物阴影实时模拟
- OpenCASCADE绘制测试线束:拓扑命令之扫掠Sweeping
- 听说版本会说话,你相信吗?
- 前端技术-调试工具(上)
- 5元素升级android6,升级你的app以支持高长宽比的新旗舰
- golang 上下文 Context
- MDC功能软件-感知融合算法介绍
- android:ClassNotFoundException for Activity class的解决方法
- 请在微信客户端打开链接
- 淘宝订单导出到excel_将产品添加到Excel订单
- 解决MAC上Django连接Mysql django.db.utils.OperationalError: (2003, Can't connect to MySQL 的问题
- AidLux“换脸”案例源码详解 (Python)
- SQL协同Excel制表统计各学院一二三等奖
- 计算机cpu基本功能,cpu的基本功能包括
- 免费亚马逊云服务器AWS EC2使用流量查看
- Cordova各种事件
- IAP 与 STC 的区别
- 【我的渲染技术进阶之旅】你可能永远猜不到为什么Filament项目命名为TNT?
热门文章
- MySQL 8 复制(六)——拓扑与性能
- sonoff开关改装件控制(3) ------flutter导入其他安卓项目的依赖包
- Redis命令详解:Pub/Sub
- 走近源码:Redis命令执行过程(客户端)
- rc振荡器振荡频率计算_微控制器中的振荡器频率
- 2022-3-30 Leetcode 1133.最大唯一数
- 【Flink基础】-- Flink CDC介绍
- 珠三角技术沙龙第 4 期总结(含照片、ppt 和视频)
- Gamma 函数及其应用
- linux 6 telnet目录,在linux6.8安装telnet服务