UNIX环境下的共享内存
好久没更新博客了,最近几个月一直在忙项目,现在终于有时间进一步学习了。这次记录的是unix环境中共享内存的使用方法。
/*write.c*/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> /*共享内存中缓冲区的大小*/
#define BUFFER_SIZE 2048 struct temp
{
int write_flag;
char share_buffer[BUFFER_SIZE]
}; int main(int argc, char const *argv[])
{
int shmid; /*循环开关*/
int running = ; char buffer[BUFFER_SIZE]; struct temp *share_temp; /*合成键值*/
key_t key = ftok(".", ); /*打开共享内存*/
if((shmid = shmget(key, sizeof(struct temp), IPC_CREAT)) == -)
{
printf("memory get failed\n");
exit(EXIT_FAILURE);
} printf("shmid is %d\n", shmid); /*映射共享内存*/
if((share_temp = shmat(shmid, NULL, )) == (void *)-)
{
printf("memory at failed\n");
exit(EXIT_FAILURE);
} /*循环写入数据*/
while(running)
{
while(share_temp->write_flag)
{
sleep();
printf("wait for read process\n");
}
fgets(buffer, BUFFER_SIZE, stdin);
strncpy(share_temp->share_buffer, buffer, BUFFER_SIZE); share_temp->write_flag = ;
if(strncmp(share_temp->share_buffer, "end", ) == )
running = ;
} /*分离共享内存*/
if((shmdt((void *)share_temp)) == -)
{
printf("memory fenli failed\n");
exit(EXIT_FAILURE);
} return ;
}
/*read.c*/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> /*共享内存中缓冲区的大小*/
#define BUFFER_SIZE 2048 struct temp
{
int write_flag;
char share_buffer[BUFFER_SIZE]
}; int main(int argc, char const *argv[])
{
int shmid; /*循环开关*/
int running = ; struct temp *share_temp; key_t key = ftok(".", ); /*创建共享内存*/
if((shmid = shmget(key, sizeof(struct temp), IPC_CREAT|)) == -)
{
printf("memory get failed\n");
exit(EXIT_FAILURE);
} printf("shmid is %d\n", shmid); /*映射共享内存*/
if((share_temp = shmat(shmid, NULL, )) == (void *)-)
{
printf("memory at failed\n");
exit(EXIT_FAILURE);
} /*循环读取数据*/
while(running)
{
if(share_temp->write_flag)
{
printf("write is %s\n", share_temp->share_buffer);
share_temp->write_flag = ;
} if(strncmp(share_temp->share_buffer, "end", ) == )
running = ;
} /*分离共享内存*/
if((shmdt((void *)share_temp)) == -)
{
printf("memory fenli failed\n");
exit(EXIT_FAILURE);
} /*删除共享内存*/
if((shmctl(shmid, IPC_RMID, )) == -)
{
printf("memory delete failed\n");
exit(EXIT_FAILURE);
} return ;
}
下面说说写程序过程中遇到的问题:开始用普通用户执行read程序,创建共享内存的时候没有加上0666选项,结构返回错误信息memory at failed,即连接到进程空间失败,切换到root用户再执行就可以。一开始还以为linux歧视普通用户,不让普通用户使用共享内存。后来发现创建的时候加上权限0666就可以了,其他IPC对象也同理。
如果有疑问或错误,欢迎指出。
UNIX环境下的共享内存的更多相关文章
- [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
http://blog.csdn.net/stpeace/article/details/39534361 进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法. 那么, 在本文中 ...
- Linux环境进程间通信(五): 共享内存(下)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- Unix IPC之基于共享内存的计数器
目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...
- Linux环境进程间通信(五): 共享内存(上)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- Tomcat集群环境下session共享方案 通过memcached 方法实现
对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...
- 缓存利器、Lua模块下的共享内存
上一节讲到了worker进程的共享内存,它利用丰富的指令使数据的缓存操作变得非常简单,但它也存在一些缺点. 1.worker进程之间会有锁竞争,在高并发的情况下会增加性能开销.2.只支持Lua布尔值. ...
- win32下进程间通信——共享内存
一.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...
- Linux环境编程之共享内存区(一):共享内存区简单介绍
共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...
- 【SpringBoot】spring-session-data-redis 解决集群环境下session共享
为什么会产生Session共享问题 集群情况下,session保存在各自的服务器的tomcat中,当分发地址至不同服务时,导致sesson取不到,就会产生session共享问题. 解决方案 负载均 ...
随机推荐
- EF结合SqlBulkCopy在项目中的使用
这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅. 我现在参与的这个项目采用的是EF框架,方便了数据库的访问.但在实际中,发现项目中导入市县Excel数据耗时太长,于是趁这段时间专门研究了 ...
- aliyun云服务器硬件性能测试
1.所购买阿里云服务器信息 2.dd命令测试 3.
- Android开发手记(28) Handler和Looper
Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...
- recursive - simple screenshot but detail principle.
the code below demonstates the principle of the'recursive-call' that the programing beginner may be ...
- TestNG扩展
1. TestNG API 本章节将讨论如何使用TestNG API来创建自己的TestNG对象.TestNG的API基本由接口组成,这样做是为了容易模拟TestNG返回的对象. 1.1 org.te ...
- MVC 文本转换成html显示
最近在学习ASP.NET MVC,项目中需要将后台传输的HTML文本在前台页面显示:@Html.Raw(HttpUtility.HtmlDecode(ViewBag.DisplayText)).记下来 ...
- php基础知识【函数】(9)数学和对象类函数
一.数学 abs -- 绝对值 ceil -- 进一法取整 floor -- 舍去法取整 fmod -- 返回除法的浮点数余数 round -- 对浮点数进行四舍五入 sqrt -- 平方根 pi( ...
- strcpy实现
#include <iostream> using namespace std; char *strcpy(char *strDest, const char *strSrc) { if ...
- Python学习 - 编写一个简单的web框架(一)
自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...
- 升级Python至2.7.8,并安装django
1:下载Python-2.7.8.tgz2:步骤:tar -zxvf Python-2.7.8.tgzcd Python-2.7.8./configure -h --查看configure选项./co ...