免费注册 查看新帖 |

Chinaunix

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

如何在共享存储段中建立一个数据对象链接列表 apue习题15.13 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-06 09:22 |只看该作者 |倒序浏览
问题如题
答案也看了
没看懂
最好哪位能给出代码 小弟参考参考
没有代码给描述下也行

[ 本帖最后由 tianxiaogang12 于 2009-8-6 09:28 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-08-06 09:48 |只看该作者
个人做法:
1,分配足够大小的共享内存
2,写一个共享内存的分配函数,记录内存用了多少、还剩多少,返回剩余的首地址
3,作用该分配函数动态的生成链表

论坛徽章:
0
3 [报告]
发表于 2009-08-06 10:07 |只看该作者
说说我对你的做法的理解, 看对不对阿
1,分配足够大小的共享内存
         用库函数malloc(比如返回地址是ptr)进行分配足够大小内存,
         shmget共享内存, 然后然后把共享内存依附于刚才 malloc分配的内存ptr
2,写一个共享内存的分配函数,记录内存用了多少、还剩多少,返回剩余的首地址
         基于ptr定义分配函数, 这不难,假设定义好了 my_malloc,
        把链表的节点要用的空间用my_malloc进行分配, 这样就把节点存储在共享
        内存了
3     把刚才在共享内存分配的地址用来进行链表的链接

是这样的吗?
但是这是不是太繁琐了,  主要是在写自己的分配函数那,
有没有别的好方法阿

论坛徽章:
0
4 [报告]
发表于 2009-08-06 10:22 |只看该作者
共享内存的分配函数不复杂:
struct TShmAlloc
{
        int                 used;
        int                total;                //total usable byte
        void        *pstart;        //start address
        void        *pcurr;                //current position
};
struct TShmAlloc tShmAlloc={0};

void* ShmAlloc(int size)
{
        if( size<=0 )
                size = 1;

        if( size > tShmAlloc.total - tShmAlloc.used )
        {
                abort();        //died yourself.
        }

        void *pret        = tShmAlloc.pcurr;

        tShmAlloc.pcurr                += size;
        tShmAlloc.used                += size;

        return pret;
}

论坛徽章:
0
5 [报告]
发表于 2009-08-06 10:50 |只看该作者
谢谢ls, 还有个问题

就是父子进程 都是通过键key来获得共享内存的引用,这样就达到了共享目的,
但是怎么来获取刚才存放在共享内存的链表呢? 或者是链表的head指针


我的做法是这样

code :
   struct link *head

   head = (struct link *)shared_memory; //shared_memory 是共享内存的地址


code :
   struct link *head

   head = (struct link *)shared_memory; //shared_memory 是共享内存的地址
是不是这样父子进程就获得了共享内存里的链表
不是这样的话,怎么获取链表的?

论坛徽章:
0
6 [报告]
发表于 2009-08-06 11:42 |只看该作者
这样也可以,也可以有共享内存的顶部放置一些索引结构,访问共享内存中分配的具体结构。。

论坛徽章:
0
7 [报告]
发表于 2009-08-06 12:11 |只看该作者
共享内存的顶部放置一些索引结构 这个办法好阿, 怎么自己没有想到呢 呵呵, 谢谢ls
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP