免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1947 | 回复: 3
打印 上一主题 下一主题

[C] 关于共享内存使用的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-16 17:09 |只看该作者 |倒序浏览
疑问有以下几点:
1.由于共享内存不会随着进程的释放而释放,那么需要在进程的结尾使用shmdt断开共享内存连接吗?(PS:这里的进程指单进程而非多进程)
2.共享内存伴随程序第二次运行,无法从共享内存中读取数据,本人使用的是固定的KEY来创建的内存,在进程结尾断开连接。
   这样是否就意味着共享内存中的东西自动会消失?
3.共享内存是否是主要运用于多线程中?

之所以有以上几点疑问是因为在程序中运行共享内存结果不如意。废话不多说。直接上代码。
/********************************************
*
* Name: shmcopy.c
*
* Funtion:
*
*
* Time:2014-10-09
*
********************************************/

#include "fpfmipc.h"
#include "ourhdr.h"
#include <fcntl.h>

int createfile( char* pathname );

int main( int argc,char* argv[] )
{
   int filedes;
   int shmid;
   pid_t pid;

   /*** 自定义初始化共享内存结构 ****/
   databuf_s *buf1,*buf2;   
   
   /***   参数区控制   ***/
   if ( argc != 3 && argc != 2)
   {
      usage();   //提示函数
      return -1;
   }
   if ( argc == 3 )
   {
      if ( filedes=createfile( argv[2] ) < 0 )
         err_sys("createfile error");
         return -1;
   }
   
   /*  创建并连接共享内存*/
   if ( shmid=getseg(&buf1) < 0 )
   {
      err_sys("getseg error:");
      return -1;
   }
      
   /*  打开文件 */
   switch ( tolower(argv[1][0]) )
   {
      case 'w':
         writer( buf1,filedes );   //将共享区数据中写入文件
         break;
      case 'r':
         reader( buf1,filedes );   //从文件中读取数据到共享区
         break;
      case 'd':
         shmctl( shmid ,IPC_RMID, 0 );
         printf("Remove Share Memory\n");
      default:
        usage();
   }
   
   /** 断开连接 ****/
   if ( shmdt( (char*)buf1 ) < 0 )
   {
      err_sys("shmdt error");
      return -1;
   }  


/*******
   switch(pid=fork())
   {
      case -1:
         err_sys("fork");
      case 0:
         writer(semid,buf1,buf2);
         removeshm();
         break;
      default:
         reader(semid,buf1,buf2);
         break;
   }
****/
   exit(0);
}

运行结果后 使用ipcs -am 中并没有显示新的share memory

论坛徽章:
0
2 [报告]
发表于 2014-10-20 16:05 |只看该作者
shmdt负责断开连接,禁止本进程再使用本共享内存,详见http://baike.baidu.com/view/3191213.htm?fr=aladdin。共享内存的本质是一块由操作系统管理的内存,操作系统保存其句柄,而每个进程通过连接,将这块内存映射到自己的进程空间中来。共享内存中的东西不会自己删除,除非有进程修改,或者本内存被删除。
另外,共享内存可以用于进程和线程,不过主要用于进程,是进程间通信最快的方法。

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
3 [报告]
发表于 2014-10-20 16:46 |只看该作者
建议:

    进程初始化的时候,根据ftok算出key,然后把对应的这个KEY去shmget一个handle,然后对着个handle执行IPC_RMID,但要防止别人删除ftok的文件(这又是另外一个话题了。。。)

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2014-10-21 09:53 |只看该作者
用mmap不就好了,给个大家知道的文件名,想怎么用就怎么用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP