自测之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 ...
随机推荐
- 在控制台中操作MYSQL数据库步骤以及一些小问题
一直用Navicat来对MySQL数据库进行操作,今天突然想试试用DOS控制台来操作,特记录自己第一次使用经历,若有错误之处,还望大佬们指点. 首先打开控制台,win+R键,输入cmd,确定 输入my ...
- awk命令用法
awk:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,是一个强大的文本分析工具,在对数据分析并生成报告时很有优势. awk有3个不同版本: awk.nawk和gawk, ...
- 剑指Offer-二维数组查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- laravel4.2 Redis 使用
laravel4.2 Redis 使用 配置文件,app/config/database.php 'redis' => array( 'cluster' => false, 'defaul ...
- ASA 5.0/8.0/9.0 杂记
ASA 10.0 之前的版本都是使用odbc方式连接,由于某个项目的需求,无奈学习一下这些老掉牙的技巧. 1.新建 数据源 (不会的话,自行搜索一下) 2.使用 快捷方式 或者 其他方式 执行 C:\ ...
- 集合之Map
Map:存放键值对,根据键对象找对应的值对象.键不能重复!Map键不能重复,有唯一性,一般通过键找对应的的值Map集合的特点: 1.具有映射关系 2.两列 3.一列要唯一 一列可以重复 键类似于 Se ...
- STM32(12)——CAN
简介: CAN是Controller Area Network,是 ISO 国际标准化的串行通信协议. CAN 控制器根据两根线上的电位差来判断总线电平.总线电平分为显性电平和隐性电平,二者必居其一 ...
- Sql Server char、varchar、nchar、nvarchar的区别
(1) 定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字符,根据 ...
- 网络相关知识点:nginx相关概念
今天我们来介绍一下反向代理以及负载均衡相关内容: 反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求, 然后将请求转发给内部网络上的服务器,并将从 ...
- 北京Uber优步司机奖励政策(1月5日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...