题目:创建一个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. C++常用的系统函数

    数学<math.h>: 1 三角函数 double sin (double); double cos (double); double tan (double); 2 反三角函数 doub ...

  2. mysql主从延迟复制

    需求描述 正常情况下我们是不会有刻意延迟从库的需求的,因为正常的线上业务自然是延迟越低越好.但是针对测试场景,业务上偶尔需要测试延迟场景下业务是否能正常运行. 解决方案 针对这种场景mysql有一个叫 ...

  3. 新手Linux命令学习

    一.dd命令:1.可以复制文件,2.可以制作ios镜像,简单理解就是备份 常用的参数  if 设置输入文件的名称 of  设置输出文件的名称 bs  设置每个“”块“”大小 count  要复制“块” ...

  4. md5加密+盐方式一

    这种方法是采用随机生成盐值加入password中组合成的新密码,下面是md5+盐的一个工具类,直接导入使用即可! 工具类 package com.oracle.utils; import java.s ...

  5. Spring的绿草丛

    Spring 轻量级框架,JavaEE的春天,当前主流框架 “站立式”的企业应用开发框架 目标 实现有的技术更加易用,推进编码最佳实践 内容:loC容器,AOP实现,数据访问支持:简化JDBC/ORM ...

  6. PHP文档生成器(PHPDoc)的基本用法

    目录 PHP文档生成器(PHPDoc)的基本用法 PHPDoc概述 安装 PHPDoc注释规范 页面级别的注释 代码级别的注释 生成API文档 额外软件 PHP文档生成器(PHPDoc)的基本用法 P ...

  7. Spark实际项目中调节并行度

    实际项目中调节并行度 实际项目中调节并行度 并行度概述 spark架构一览 如果不调节并行度,导致并行度过低,会怎么样? 设置spark作业并行度 小结 并行度概述 其实就是指的是,Spark作业中, ...

  8. LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他

    LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...

  9. 北京Uber优步司机奖励政策(3月16日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. 成都Uber优步司机奖励政策(4月1日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...