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

关于linux shmat 地址奇怪问题,请熟悉共享内存的高手指点一下

    来源: 互联网  发布时间:2017-02-01

    本文导语:  以前在as4,rh9上用shmat返回的地址每次都是一样的,因此共享内存里最前面定义大量的指针数组直接指向共享内存各个部分地址, 可是现在换centos 4,发现每次shmat取的地址都不一样了,导致数组指向的地址都无效了?...

以前在as4,rh9上用shmat返回的地址每次都是一样的,因此共享内存里最前面定义大量的指针数组直接指向共享内存各个部分地址,
可是现在换centos 4,发现每次shmat取的地址都不一样了,导致数组指向的地址都无效了???,怎么解决

我试过将不一样的地址重新偏移是可以得到正确的结果,但这样太麻烦了,怎么样能保证shmat每次取的地址都一致呢,或者 有什么更好的方法

不知道大家明白我的意思没

|
貌似这两种方式都可以实现:
1、一楼的方式
2、二楼的方式,选择未用的堆地址空间,shmaddr 参数 PAGE 对齐或设置 SHM_RND

一般都用第一种方式;没人愿意采用第二种方式,可能会出现一些移植问题...

|
没有用过你说的系统。



#include 
#include 
#include 
#include 
#include 

typedef struct test
{
  char a[256];
  char *b;
  char c[256];
} test;


#define SHM_CREATE 1
#define SHM_LOAD 0
#define SHM_FILE "/var/test.shm"
#define SHM_SIZE 8000

char *
init_shm (const int flag, char *pathname, const unsigned long size, int shmid)
{
  char *ret = NULL;
  int shm_id = 0;
  key_t key = ftok (pathname, 'R');
  if (SHM_CREATE == flag) // 新建 
    {
      shm_id = shmget (key, size, IPC_CREAT | IPC_EXCL | 0600);
      if (-1 == shm_id)
{
  shm_id = shmget (key, size, 0);
  if (-1 == shm_id)
    {
      perror ("init_shm shmget create");
      return NULL;
    }
}
      printf("shm_id = %dn", shm_id);
      if ((ret = shmat (shm_id, (char *) 0xb7f17000, 0)) == (void *)-1) {
perror("shmat");
exit(1);
      }
      memset (ret, 0, size);
    }
  else
    {/*
      shm_id = shmget (key, size, 0);
      if (shm_id == -1)
{
  perror ("init_shm shmget load");
  return NULL;
}
     */
      ret = shmat (shmid, (char *)0xb7f17000, 0);
    }
  return ret;
}

int
main (int argc, char **argv)
{
  int shmid;
  char *arg = argv[1];

  if (argc != 3) {
    printf("Usage: %s cmd shmidn", argv[0]);
    exit(1);
  }

  if (*arg == 'c')
    {
      system ("touch " SHM_FILE); // create shm file 
      printf("SHM_FILE' size = %dn", SHM_SIZE);
      test *t = (struct test *) init_shm (SHM_CREATE, SHM_FILE, SHM_SIZE, shmid);
      t->b = t->c;

      if (t)
{
  printf("t->a size = %dn", sizeof(t->a));
  //t->b =(char *) t + sizeof(t->a);
  printf ("addr = 0x%08x/0x%08xn", (unsigned int)t->b, (unsigned int)t);
  strcpy (t->a, "AAAA");
  strcpy (t->b, "111");
  printf ("a=%s,b=%sn", t->a, t->b);
}
    }
  else if (*arg == 'l')
    {
      shmid = atoi(argv[2]);
      test *t = (struct test *) init_shm (SHM_LOAD, SHM_FILE, SHM_SIZE, shmid);
      printf ("addr = 0x%08x/0x%08xn",(unsigned int)t->b, (unsigned int)t);
      //t->b = (char *)t + sizeof(struct test); // 重新定位b的位置 
      if (t)
{
  printf ("a=%s,b=%sn", t->a, t->b);
}
    }
  return 0;
}




    
 
 

您可能感兴趣的文章:

  • 关于Linux中romfs的问题,请高手指点指点
  • 菜鸟求救:在linux下安装jdk失败。初次使用linux,还请各路大虾指点指点,不甚感激!!!
  • 我的linux的安装问题,请大家给指点指点。多谢了!!!
  • 求高手指点,arm-linux
  • Linux 安装开发环境报错 求指点
  • 请各位使用过Linux的进来看看,指点指点(在线等待)! 谢谢
  • Linux的嵌入式开发,请高手指点
  • 刚刚进入linux下编程,请指点入门~~~
  • linux内核里面的所有头文件,有没有整理过的,请高手指点!谢谢!!!
  • 如何运程控制 linux 请高手指点。
  • 何运程控制 linux 请高手指点。
  • 想走嵌入式linux设备驱动方向,请多指点
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • 板载AC97声卡的驱动问题,望Linux 高手指点
  • linux平台下面,能同时支持php,asp吗,如果可以,能不能详细指点。 在线等候!
  • 请linux的gnome开发高手指点
  • 关于在VMware下安装linux,请高手指点,先谢过!
  • 下一步该学习linux/unix的什么?请高手指点……
  • 有关linux这方面的应用和发展方向有哪位高手可以指点我一下!!!
  • linux下如何执行project文件,高人指点。
  • Linux 安装之后的 遇到的奇怪问题?
  • 虚拟机里装linux的奇怪问题
  • Linux下的文字编辑软件gedit问题?奇怪!!!!!!!!
  • /***奇怪!安装Red Hat Linux 7.2后怎么Konqueror打不开?***/
  • linux一个很奇怪的问题!
  • windows 2000 访问linux下smaba时候 2G以上大小的文件显示出来的大小很奇怪
  • LINUX中crontab的奇怪问题
  • linux网络编程问题:奇怪的缓冲区?
  • 关于LINUX I2C,GCC的奇怪问题。。。问题依旧。。
  • Linux这么奇怪?
  • LINUX系统遇到超级奇怪的事情,大家帮忙解惑
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 学习linux该从何而起,熟悉java,但不是很熟悉c或者c++
  • 急寻一位熟悉Linux熟悉GTK+编程,有时间的高手做一个例程,酬劳可谈
  • 熟悉linux
  • 寻找对LINUX ORACLE熟悉的朋友
  • 想请教linux下开发分布式应用程序问题,期望与熟悉orbit的高手交流!
  • linux下的串口编程比较熟悉,麻烦帮忙!
  • 那里有可以远程登陆的UNIX/LINUX 服务器,我想熟悉一下UNIX!!
  • 谁多linux下的anjuta这个工具比较熟悉的?
  • 招聘: 嵌入式linux工程师,1-2年工作经验,熟悉QT
  • 想认识些熟悉linux环境下开发的朋友,我原来是windows的
  • 下一步该学习linux/unix的什么?请高手指点…… iis7站长之家
  • P133, 2G硬盘, 64M内存, 14''显示器, S3 64V+显卡(1M显存)能不能装Redhat Linux? 只是为了熟悉一下.
  • 哪位大哥对“arm-linux的页表映射”比较熟悉啊?
  • Starting PHP with FastCGI ??? 请熟悉PHP和LINUX的高手帮忙解决这个问题,谢谢!!!
  • 如果没有LINUX环境,仅凭看书,如何在短时间内尽可能多地熟悉LINUX下的操作?
  • 想学linux !!!!!!!对linux系统,编程都不怎么熟悉,想学学!!大家可否推荐比较好的书 啊!!
  • 请问哪位熟悉LINUX 下的SORT命令?
  • 有这样一个c++servlet环境,但只有linux下的实现,我想移植到windows下,有哪位熟悉apache,和linux,window编程的大哥指点一下
  • 想深入学习linux下编程,请问在熟悉linux同时是不是应该好好找本书学c++?
  • 哪位大哥对“arm-linux的页表映射”比较熟悉啊?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


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

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

    浙ICP备11055608号-3