题目:创建一个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:共享内存的更多相关文章

  1. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  2. Linux 共享内存详解一

    共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...

  3. PHP进程通信基础——信号量+共享内存通信

    PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...

  4. C++ 共享内存 函数封装

    #pragma once #include <string> #include <wtypes.h> #include <map> using namespace ...

  5. Linux学习笔记(14)-进程通信|共享内存

    在Linux中,共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可 ...

  6. linux 共享内存 shmat,shmget,shmdt,shmctl

    shmget int shmget(key_t key, size_t size, int flag);//开辟一段共享内存 key_t key :标识符的规则() size_t size :共享内存 ...

  7. Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  8. linux后台查看共享内存和消息队列的命令

    ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...

  9. c++共享内存(转载)

    对于连个不同的进程之间的通信,共享内存是一种比较好的方式,一个进程把数据发送到共享内存中, 另一个进程可以读取改数据,简单记录一下代码 #define BUF_SIZE 256 TCHAR szNam ...

随机推荐

  1. QT 防止FTP 上传软件在断连处 Crash

    前段时间发现项目中的上传FTP软件有可能会在从服务器申请断连时Crash, 所以加了一个Timer. 由于项目代码行数过大, 此处上传部分代码片段. timeoutTimer = new QTimer ...

  2. PHP服务端支持跨域

    跨域 由于浏览器的同源策略,导致浏览器页面访问非同源(协议.域名.端口任一不同)服务器产生跨域问题! PHP服务端配置支持跨域: // 指定允许其他域名访问, * 表示全部域名 header('Acc ...

  3. 论反向ajax

    在讨论反向ajax之前,说一下我大二写的一个聊天程序,通过前端ajax不断向服务器发送请求(通过http连接),服务器进行一次数据库查询,然后返回结果,断开与服务器的链接(绝大部分都是无用的结果)来维 ...

  4. 关于指针的笔记【1】【C语言程序设计-谭浩强】

    指针是什么? 一个 变量的地址称为该变量的"指针"[将地址形象化的称为“指针”].(指针是什么百度百科) 注意区分储存单元的地址和内容这两个概念的区别. 直接访问:直接按变量名进行 ...

  5. NUCLEO-L053R8 RCC时钟树 MCO输出

    RCC时钟配置实验 最近玩了一下Nucleo-L053R8板子,即STM32L053R8T6.浏览了RCC章节后,顺便做了个小实验,现在给大伙分享一下. 实验非常简单,配置一下系统时钟,可以通过肉眼观 ...

  6. Java两个线程实现交替运行-以交替打印奇偶数为例

    本文旨在两个线程交替运行,不多哔哔直接看代码吧 public class Work2 { static final Object object = new Object(); public stati ...

  7. BZOJ:2763-[JLOI2011]飞行路线(最短路分层图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 解题心得: 第一次见到分层最短路.其实题中说选择k条路径免费,那怎么选k条路径并没 ...

  8. APP如何发布到Google play 商店

    APP如何发布到Google play 商店?以及有哪些需要注意的点 2015-05-13 10:07 19773人阅读 评论(1) 收藏 举报  分类: iPhone游戏开发(330)  链接:ht ...

  9. Prism for WPF 搭建一个简单的模块化开发框架(一)

    原文:Prism for WPF 搭建一个简单的模块化开发框架(一) 最近闲来无事又想搞搞WPF..... 做个框架吧,可能又是半途而废....总是坚持不下来 不废话了, 先看一下工程结构 布局大概是 ...

  10. BZOJ1452_Count_KEY

    题目传送门 二维树状数组,对于每个颜色开一个树状数组,用容斥求解. code: #include <cstdio> using namespace std; int read() { ') ...