题目:创建一个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. #leetcode刷题之路8-字符串转换整数 (atoi)

    请你来实现一个 atoi 函数,使其能将字符串转换成整数.首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面 ...

  2. 学习笔记 - Manacher算法

    Manacher算法 - 学习笔记 是从最近Codeforces的一场比赛了解到这个算法的~ 非常新奇,毕竟是第一次听说 \(O(n)\) 的回文串算法 我在 vjudge 上开了一个[练习],有兴趣 ...

  3. Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore[转]

    [转载]http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDow ...

  4. 【淘宝客】批量提取QQ号

    1:打开QQ群官方,网址:http://qun.qq.com/ 2.点击导航栏:群管理 3.点击成员管理,选择需要提取QQ号的群 4.全选复制群成员 5.打开网址:http://tool.oschin ...

  5. 使用ntp协议同步本地时间(C语言)

    使用ntp协议同步本地时间 同步服务器使用的东北大学网络授时服务:ntp.neu.edu.cn更多ntp服务器 http://www.ntp.org.cn/ 源代码来自网络,经本人精简ntp部分,供大 ...

  6. BugkuWeb本地包含

    知识点:$_REQUEST不是一个函数,它是一个超全局变量,里面包括有$_GET $_POST $_COOKIE的值,$_REPUEST 是接收了 $_GET $_POST $_COOKIE 三个的集 ...

  7. 542. 01 Matrix

    class Solution { public: vector<vector<int>> res; int m, n; vector<vector<int>& ...

  8. Python3爬虫(十五) 代理

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.设置代理 1.urllib #HTTP代理类型 from urllib.error import URLErr ...

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

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

  10. spring源码-bean之初始化-1

    一.spring的IOC控制反转:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了松耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查 ...