自测之Lesson13:共享内存
题目:创建一个64K的共享内存。
实现代码:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h> #define MEM_SIZE 0x10000 // 设置创建的共享内存大小为64K int main()
{
key_t key;
key = ftok("a", 1);
if (key == -1) {
perror("fail ftok");
return -1;
} int shmid;
shmid = shmget(key, MEM_SIZE, IPC_CREAT | 0664);
if (shmid == -1) {
perror("fail shmget");
return -1;
}
// 打印共享内存的id和key值
printf("key:%#x\nshmid:%d\n", key, shmid); return 0;
}
题目:分别完成一个向共享内存读/写的程序,要求这两个程序指向同一共享内存。
实现代码:
/* 写共享内存 */
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h> #define MEM_SIZE 0x10000 // 64K 共享内存大小
#define SEG_SIZE 0x100 // 256b 分块大小 int main()
{
key_t key;
char szBuf[256];
key = ftok("a", 1);
if (key == -1) {
perror("fail ftok");
return -1;
} int shmid;
shmid = shmget(key, MEM_SIZE, IPC_CREAT | 0664);
if (shmid == -1) {
perror("fail shmget");
return -1;
} printf("key:%#x\nshmid:%d\n", key, shmid); // shmat() 返回共享内存映射到内存的某一地址
char *addr;
addr = shmat(shmid, NULL, 0);
if (addr == (char *)-1) {
perror("fail shmat");
return -1;
}
printf("share memory addr:%p\n", addr); // 写共享内存
int offset = 0;
while(1) {
fprintf(stderr, "[Write]:");
// scanf("%s", szBuf); 不能读入空格
read(STDIN_FILENO, szBuf, 256);
if (offset == MEM_SIZE / SEG_SIZE) {
printf("Share Memory is full!\n");
break;
}
else {
memcpy(addr + SEG_SIZE * offset, szBuf, SEG_SIZE); // 将szBuf的值copy到共享内存
offset++;
}
}
shmdt(addr);
return 0;
}
/* 读共享内存 */
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h> #define MEM_SIZE 0x10000 // 64K 共享内存大小
#define SEG_SIZE 0x100 // 256b 分块大小 int main()
{
key_t key;
char szBuf[256];
key = ftok("a", 1);
if (key == -1) {
perror("fail ftok");
return -1;
} int shmid;
shmid = shmget(key, MEM_SIZE, IPC_CREAT | 0664);
if (shmid == -1) {
perror("fail shmget");
return -1;
} printf("key:%#x\nshmid:%d\n", key, shmid); // shmat() 返回共享内存映射到内存的某一地址
char *addr;
addr = shmat(shmid, NULL, SHM_RDONLY);
if (addr == (char *)-1) {
perror("fail shmat");
return -1;
} printf("key:%#x\nshmid:%d\n", key, shmid); // shmat() 返回共享内存映射到内存的某一地址
char *addr;
addr = shmat(shmid, NULL, SHM_RDONLY);
if (addr == (char *)-1) {
perror("fail shmat");
return -1;
}
printf("share memory addr:%p\n", addr); //打印共享内存映射到的内存地址 // 读共享内存
int offset;
while(1) {
fprintf(stderr, "[Read Seg-index]:");
scanf("%d", &offset);
if (offset == MEM_SIZE / SEG_SIZE) {
printf("Read over edge!\n");
break;
}
else {
memcpy(szBuf, addr + SEG_SIZE * offset, SEG_SIZE);
printf("->%s\n", szBuf);
}
}
shmdt(addr);
return 0;
}
题目:完成一个读取系统当前共享内存区使用情况的程序,要求使用shmctl函数完成。
实现代码:
自测之Lesson13:共享内存的更多相关文章
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
- Linux 共享内存详解一
共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...
- PHP进程通信基础——信号量+共享内存通信
PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...
- C++ 共享内存 函数封装
#pragma once #include <string> #include <wtypes.h> #include <map> using namespace ...
- Linux学习笔记(14)-进程通信|共享内存
在Linux中,共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可 ...
- linux 共享内存 shmat,shmget,shmdt,shmctl
shmget int shmget(key_t key, size_t size, int flag);//开辟一段共享内存 key_t key :标识符的规则() size_t size :共享内存 ...
- Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- linux后台查看共享内存和消息队列的命令
ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...
- c++共享内存(转载)
对于连个不同的进程之间的通信,共享内存是一种比较好的方式,一个进程把数据发送到共享内存中, 另一个进程可以读取改数据,简单记录一下代码 #define BUF_SIZE 256 TCHAR szNam ...
随机推荐
- C++ Primer 第8章作业
练习8.1 编写函数,接受一个istream&参数,返回值类型也是istream&. 此函数须从给定流中读取数据,直至遇到文件结束标识时停止.它将读取的数据打印在标准输出上.完成这些操 ...
- python初学者日记02(正则表达式)
写作时间:2018/12/17 作者:永远的码农(博客园) 一.正则表达式简介: 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或R ...
- ORALCE表的约束条件
一.主键:(PRIMARY KEY) 主键是表中的一列或多列.为表定义主键有如下几个作用: 1.主键包含的列不能输入重复的值,以此来保证一个表的所有行的唯一性: 2.主键也不允许定义此约束的列为NUL ...
- log4j配置输出日志文件
在测试程序时,有时候运行一次可能需要很久,把日志文件保存下来是很有必要的,本文给出了scala程序输出日志文件的方式,同时使用本人的另一篇博客中介绍的将log4j.properties放到程序jar包 ...
- Python递归二分法
# lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] # 时间复杂度. n# # 让用户输入一个数n. 判断这个n是否出现在lst中# n = ...
- rails应用中各数据平台的对接
1.mongo #Gemfile添加如下两个gem包gem 'mongoid', '~> 5.1.0' gem 'mongo', '~> 2.4’ @client = Mongo::Cli ...
- #if、#if defined 的使用
#if的使用 if 后面接的是表达式 #if a==1 code -- #endif 如果#if后面的表达式能成立,就会把#if和#endif之间的代码编译进去 #if defined的使用 #if ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- Java基础之final和abstract关键字
final final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编 ...
- 安装cuda9.0+cudnn v7+python3.5.3+tensorflow
本机设备 windows10 gtx1060 安装软件及下载地址 python-3.5.3-amd64 链接:https://pan.baidu.com/s/1I3oIDatMgvDLEtaPtvu ...