免费注册 查看新帖 |

Chinaunix

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

急求附接共享存储区的算法!在线等! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-25 05:27 |只看该作者 |倒序浏览
RT!能否提供一下 shmget 的语法?
另外,消息的数据结构怎么写?接受消息的算法怎么写?

论坛徽章:
0
2 [报告]
发表于 2003-10-25 09:01 |只看该作者

急求附接共享存储区的算法!在线等!

man shmget
man msgget
man msgctl
man msgsnd
man msgrcv
man man
man woman

论坛徽章:
0
3 [报告]
发表于 2003-10-26 06:32 |只看该作者

急求附接共享存储区的算法!在线等!

/* 附接共享存储区的算法 */
/* 我用C给你描述。我不知道你是否学过汇编和反汇编,如果学过,我可以用反汇编给你写,这样最准确,这是我的导师说的。 */

Input: 1、共享存储区描述符
       2、欲附接的虚地址
       3、旗帜位
Output: 1、存储区所附接的虚地址
{
    检验描述符、许可权的有效性;
   if (用户规定了虚地址)
   {
         根据旗帜位所规定的对虚地址进行舍入;
      检验虚地址、区大小的合法性;
   }
     else
          /* 用户要求内核找到合适的虚地址 */
          内核寻找虚地址:若找不到 --》记录错误;将存储区附接到进程地址空间;
    if (该区第一次被附接) 为该区分配页表、存储空间;
    return (附接的虚地址);
}

论坛徽章:
0
4 [报告]
发表于 2003-10-26 06:47 |只看该作者

急求附接共享存储区的算法!在线等!

/* 接受消息的算法 */

INPUT:1、消息描述符
        2、存放到达消息的数据数组地址
        3、数据数组大小
        4、请求的消息类型
        5、旗帜位
OUTPUT:返回的消息中的字节数
{
    检验许可权;
   loop:
    检验消息描述符的合法性;
   /* 寻找返回给用户的消息 */
    if (请求消息类型 == 0)队列里的第一个消息;
   else if (请求消息类型 >;0)队列里给定类型的第一个消息;
   else /* 请求消息类型 <0 */
             队列里 <= 请求类型的绝对值的所有消息中最低类型的第一个消息;
if (存在一个这样的消息)
{
       调整消息大小或若用户给出的大小太小:返回错误;
     从内核复制消息类型和正文到用户空间;
     从队列里删除该消息;
     return;
}
/* 不存在这样的消息 */
if (旗帜位为不要睡眠) 返回错误;
sleep(消息到达队列的事件);
goto loop;
}

论坛徽章:
0
5 [报告]
发表于 2003-10-26 07:53 |只看该作者

急求附接共享存储区的算法!在线等!

谢谢。再问一下,如果要共享存储区两次附接到进程,该怎么做?
我只懂一些汇编的皮毛,反汇编根本没有学过。最好还是用C来描述,因为C是UNIX的标准语言啊。

论坛徽章:
0
6 [报告]
发表于 2003-10-26 17:46 |只看该作者

急求附接共享存储区的算法!在线等!

我直接给你程序好了。

论坛徽章:
0
7 [报告]
发表于 2003-10-26 18:00 |只看该作者

急求附接共享存储区的算法!在线等!

#include <sys/types.h>;
#include <sys/ipc.h>;
#include <sys/shm.h>;
#define SHMKEY 75
#define K 1024

int shmid;

main()
{
        int i=0, *pint;
        char *addr1, *addr2;
        extern char *shmat();  /* 上面的附接共享存储区的实现 */
        extern cleanup();
        while(i++<20) signal(i, cleanup);
        shimd=shmget(SHMKEY, 128*K, 0777|IPC_CREAT);
        addr1=shmat(shmid, 0, 0);
        addr2=shmat(shmid, 0, 0);
        printf("addr1 0x%x addr2 0x%x\n", addr1, addr2);
        pint=(int *)addr1;
        for (i=0; i<256; i++) *pint++=1;
        pint=(int *)addr1;
        *pint=256;
        pint=(int *)addr2;
        for (i=0; i<256; i++) printf("index %d \ tvalue %d\n", i, *pint++);
        pause();
}

cleanup()
{
        shmctl(shmid, IPC_RMID, 0);
        exit();
}

论坛徽章:
0
8 [报告]
发表于 2003-10-26 18:05 |只看该作者

急求附接共享存储区的算法!在线等!

/* 如果要进程间共享存储区 */

#include <sys/types.h>;
#include <sys/ipc.h>;
#include <sys/shm.h>;
#define SHMKEY 75
#define K 1024

int shmid;

main()
{
        int i=0, *pint;
        char *addr;
        extern char *shmat();  /* 上面的附接共享存储区的实现 */
        shmid=shmget(SHMKEY, 64*K, 0777);
        addr=shmat(shmid, 0, 0);
        pint=(int *)addr;
        while(*pint==0) ;
        while(i++<256) printf("%d\n", *pint++);
}

论坛徽章:
0
9 [报告]
发表于 2003-10-27 04:23 |只看该作者

急求附接共享存储区的算法!在线等!

OK!谢谢!
顺便再问一下,你对UML熟悉吗?
你是MIT的?

论坛徽章:
0
10 [报告]
发表于 2003-10-28 00:17 |只看该作者

急求附接共享存储区的算法!在线等!

UML嘛,还行吧。我一般用 Rational Rose 来写。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP