当前位置:  技术问答>linux和unix

关于共享内存的进程间通信问题【求助】

    来源: 互联网  发布时间:2016-05-28

    本文导语:    我想通过共享内存实现进程间的通信,我看了下书上的例子,一个读程序,一个写程序。以写程序为例:#include "sharemem.h" #define SHM_SIZE 1024 int main() { int   semid, shmid; char  *shmaddr; char  write_str[SHM_SIZE]; if (...

  我想通过共享内存实现进程间的通信,我看了下书上的例子,一个读程序,一个写程序。以写程序为例:#include "sharemem.h"

#define SHM_SIZE 1024

int main()
{
int   semid, shmid;
char  *shmaddr;
char  write_str[SHM_SIZE];

if ((shmid = createshm (".", 'm', SHM_SIZE)) == -1)
{
exit(1);
}

if ((shmaddr = shmat (shmid, (char *)0, 0)) ==(char *)-1)
{
perror ("attach shared memory error!n");
exit (1);
}

if ((semid = createsem (".", 's', 1, 1)) == -1)
{
exit (1);
}

while (1)
{
wait_sem (semid, 0);
sem_p (semid, 0);  /*P操作*/

printf ("writer: ");
fgets (write_str, 1024, stdin);
int len = strlen (write_str) - 1;
write_str[len] = '';
strcpy (shmaddr, write_str);
sleep (10);  /*使reader处于阻塞状态*/

sem_v (semid, 0);  /*V操作*/
sleep (10);  /*等待reader进行读操作*/

}
}

通过上面的代码可以实现共享内存的读写,但是每次写入数据都会把之前的数据覆盖,那如果我要分多次写入几组数据然后再读出来的话该怎样实现呢?共享内存的方式能实现这个功能吗?望高手指点。

|
如果新内容已经覆盖了原来的内容,那么肯定没法讲原来内容读出来了。共享内存本身貌似无法实现这个功能。不过,你可以在每个进程建立自己的私有缓存,缓存共享内存读写的内容。毕竟,共享内存只是提供一种快速的进程间通信机制而已!

|
覆盖应该是因为你在同一个地址写了不同内容,你是否可以考虑多次写时使用首地址的偏移量来做偏移?

|
楼主忘记了不是,C和C++是两种语言,语言特性是不一样的,虽然C++兼容了很多C的特性。

|
把(char*)去掉试试。或者改为(void*)

|
shmaddr = shmat (shmid, (char *)0, 0)-->改成
shmaddr = shmat (shmid,NULL, 0))就可以了 

|
strcpy (shmaddr, write_str); 
一次写完后没有对内存偏移量做修改,可以这样写strcpy(shmaddr+偏移量,write_str),其实共享内存和程序内存的使用方法是一样的

|
对共享内存加锁,在第一次写进去的未读走之前不允许再写入,这样就好了。

    
 
 

您可能感兴趣的文章:

  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • 如何在父进程和子进程共享一个变量??
  • 多进程共享变量
  • 在linux,如何用共享内存来实现进程间的通讯?(这些进程没有父子关系)
  • linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
  • 父子进程共享数据的问题
  • 编程模拟多进程共享临界资源
  • 进程与线程资源的共享问题
  • linux:这样能实现父、子进程共享变量吗?
  • 进程同时访问两个大共享内存,会失败?
  • 进程间共享内存问题。
  • 服务器端的共享内存可否被远程客户端的进程所挂载使用?
  • 多进程编程中,可否共享数据对象?
  • 各位前辈,当代码执行一个系统调用fork()后,为什么如果共享页设置了写时拷贝位,在父进程之前调度子进程将具有优越性?内核如何能使子进
  • Linux:多进程 共享一个对象
  • Unix下如何在两个进程之间共享一块大内存??????
  • 进程数据同步:消息队列还是共享内存+信号
  • 关于子进程间共享套接字描述符的问题?
  • 父子进程通信:内存共享的问题
  • 系统中有5个进程共享一个变量A,则A的临界区由?个进程临界区组成。
  • Linux 共享内存介绍及实现代码
  • 程序需要共享内存相当大,但是系统的内存有限
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 不同用户user之间如何访问共享内存?
  • Unix/linux下如何监测共享内存的使用情况
  • 共享内存问题,高手们请进!!!
  • 判断共享内存中是否有数据
  • 【求助】linux下什么是共享内存,怎么查看。
  • linux下共享内存的覆盖或清空
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于共享存储段的使用,求助高手
  • 求助:如何在Linux编译另一台window机器上的共享文件
  • 求助samba配置问题,windows无法访问linux共享的资源
  • ~~~在线求助~~~~共享库动态加载的一个问题。解决立即给分。说话算数。
  • 求助linux普通用户下内存共享(系统V共享)大家进来看看啊!急!!
  • linux共享库调用求助
  • 求助 (急)关于fedora9安装在虚拟机中的文件共享问题
  • 目录共享问题求助!
  • 求助:已经安装了共享库,还是提示“Unable to load library”
  • 求助:我这个内存共享的小程序,编译没错,运行有错,请各位大哥帮呆板能够我,谢谢!
  • 求助!!关于共享内存的shmdt出错!
  • 求助,fork函数建立子进程后,如何让子进程和父进程共享一个变量
  • 关于共享内存的问题【求助】
  • NFS共享作业时, 在客户端只可以看到服务器端的共享目录,而看不到共享目录下的内容.?
  • 如何共享 共享库(*.so)中的变量?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?
  • 用samba共享其它机子访问Linux共享时,机子可以进入,但要打开共享文件夹时提示“无法访问...找不到网络名。”这是什么原因呢?
  • 局域网中的红旗2.0如何共享到win98服务器的联接共享?
  • 局域网共享问题:win2000的机器看不到linux机器的共享目录?解决立即给分
  • 几个servlet共享一些数据 如我从数据库里读出一些重要的设置存入vector 让几个servlet共享 怎么做到?先谢
  • 关于中断共享的问题:ADC 与触摸屏的中断共享
  • 无法访问samba服务器中的共享文件夹
  • XP下设置与linux 本地连接的Internet共享问题
  • 我想知道LINUX如何与WIN98,WIN2000共享资源?
  • 请教共享库运行时加载的问题
  • 创建共享失败。
  • 怎么我设置好vmwaretool后,还不能共享文件
  • 嵌入式linux下线程通信可以用共享文件法吗?
  • Gnome个人文件共享怎么用?
  • 当别人用FTP协议访问我的LINUX时,要显示一些共享文件夹。
  • 关于samba访问windows共享目录


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3