Chinaunix

标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~` [打印本页]

作者: dragonq    时间: 2004-04-28 11:33
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
我在SERVER程序中利用一个shmkey申请了一块共享内存,目的是CLIENT可以从该共享内存中取得一些数据,但CLIENT利用这个shmkey却不能返回shmid,是不是权限的问题?该如何设置shmid的权限啊?
程序如下:
SERVER:
int shmid = shmget( SHMKEY, SHMDATASIZE, IPC_CREAT|SHM_W|SHM_R );//成功
CLIENT:
int shmid = shmget( SHMKEY, SHMDATASIZE, 0 );
//但shmid返回值为-1
作者: 飞灰橙    时间: 2004-04-28 12:02
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
加上权限
IPC_CREATE | SHM_W | SHM_R | 0777

试试
作者: dragonq    时间: 2004-04-28 12:36
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
谢谢,不过还是不行,返回值仍然是-1
还有可能是什么其他原因吗?
作者: windflowers1976    时间: 2004-04-28 12:51
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
OYCLBOOL OYCL_CShm::GetShm(key_t tKey, int iSize, int iMode)
{
        m_bCreate = OYCLFALSE;
        if ((m_iShmId = shmget(m_tShmKey, m_iShmSize, IPC_CREAT | IPC_EXCL | iMode)) < 0)        //try to create
        {
                if (errno != EEXIST)
                        return OYCLFALSE;//throw OYCL_CShmException(strerror(errno), __FILE__, __LINE__);

                if ((m_iShmId = shmget(m_tShmKey, m_iShmSize, iMode)) < 0)
                        return OYCLFALSE;//throw OYCL_CShmException(strerror(errno), __FILE__, __LINE__);
                       
                return OYCLTRUE;
        }

        m_bCreate = OYCLTRUE;
        return OYCLTRUE;
}
作者: FH    时间: 2004-04-28 13:01
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
看errno不就知道为什么了吗?
作者: 飞灰橙    时间: 2004-04-28 13:10
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
原帖由 "windflowers1976" 发表:
OYCLBOOL OYCL_CShm::GetShm(key_t tKey, int iSize, int iMode)
{
        m_bCreate = OYCLFALSE;
        if ((m_iShmId = shmget(m_tShmKey, m_iShmSize, IPC_CREAT | IPC_EXCL | iMode)) < 0)        //try to create
        {
                i..........
不能创建已创建的SHM

两边都加上IPC_CREAT是没有问题的,
而且最好两边都加上,否则的话需要控制好两边的shmget的调用次序。
之所以上面的代码不能创建已经创建的SHM,是因为加上了IPC_EXCL的缘故
作者: windflowers1976    时间: 2004-04-28 13:31
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
原帖由 "飞灰橙" 发表:

两边都加上IPC_CREAT是没有问题的,
而且最好两边都加上,否则的话需要控制好两边的shmget的调用次序。
之所以上面的代码不能创建已经创建的SHM,是因为加上了IPC_EXCL的缘故

呵呵,不能创建已经创建的SHM不是对我自己的代码说的,是回复上述问题用的.
我的意思是请参考我贴出的代码,两边都调用上述的SHMGET,这样就没有问题了,上述代码也是久经考验的,呵呵.
意义我解释一下,就是首先尝试创建共享内存,设置IPC_EXCL标志,如果返回错误是EEXIST 说明已经创建,那么我们只需要打开就行.
作者: 飞灰橙    时间: 2004-04-28 13:35
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
原帖由 "windflowers1976" 发表:
我的意思是请参考我贴出的代码,两边都调用上述的SHMGET,这样就没有问题了,上述代码也是久经考验的,呵呵.
意义我解释一下,就是首先尝试创建共享内存,设置IPC_EXCL标志,如果?.........


也许你还不知道,SHM的创建和打开都是用shmget,
所以加上IPC_EXCL的判断完全多余。
直接用shmget(... IPC_CREAT)不加IPC_EXCL就可以了,
这样如果该SHM不存在,则自动创建一个,如果已存在,则可以看作打开。
作者: windflowers1976    时间: 2004-04-28 13:43
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
或许我是不知道,我刚好又翻了下Richard Stevens 书
UNIX 进程间通讯2卷中文版296页,
如果创建一个新的共享内存区时,必须指定一个不为零的SIZE,如果打开一个已存在的共享内存区,那么SIZE应为零.
我不知道你的观点不是不同意R S 老前辈的话.或许是我的错.
不过,你的说法我也去试验下.
作者: 飞灰橙    时间: 2004-04-28 13:59
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
原帖由 "windflowers1976" 发表:
恢?滥愕墓鄣悴皇遣煌?釸 S 老前辈的话.或许是我的错.
不过,你的说法我也去试验下.


多谢指出,我在linux上试了下,
发现打开的一方,size的值只要不超过创建的size都是可以的。
作者: windflowers1976    时间: 2004-04-28 14:06
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
补充,呵呵,如果不是WELLKNOWN SIZE那你怎么知道该用1还是1024字节?
所以,照规范做有可能是更好的选择.
作者: 飞灰橙    时间: 2004-04-28 14:23
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
原帖由 "windflowers1976" 发表:
补充,呵呵,如果不是WELLKNOWN SIZE那你怎么知道该用1还是1024字节?
所以,照规范做有可能是更好的选择.


如果要使用共享内存的话,
总要知道它的size的。
除非能通过最前一个byte得到它的size,
不然的话前辈们的代码还是没多大意义,呵呵。
作者: windflowers1976    时间: 2004-04-28 14:37
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
以前在CSDN看到过这样的论调,学习大师的代码并不代表我盲目顺从大师的代码.
上面的代码就是我本人学习大师代码后自己的封装.
CSDN论坛上的"程序员总相轻",说明的是什么问题那,讨论讨论?
不过,我也不是用零做为SIZE,^_^.
作者: xhl    时间: 2004-04-28 17:33
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
小第最近也在研究共享内存,看了各位的讨论,感觉受益非浅,下有一问:

如果我在一个程序里创建一快共想内存,如果程序正常推出,我回控制删除他,但是如果程序异常退出,这快共想内存还回存在,我知道下次启动的时候可以附家到剩余的这快内存上,但是那里的数据对我已经没有作用。所以我还是想每次启动的时候始终创建一块新的共想内存。


我是这样做的,大家给我看法, 我不知道对不对:
创建前先用检查是否存在,如果存在,将起删除,在创建,如果不存在,直接创建。
作者: windflowers1976    时间: 2004-04-28 17:52
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
个人看法:
如果不需要里面的数据, shmat 之后,       
  1. if ( m_pchShm >; (char*)0 && m_bCreated )
  2. memset(m_pchShm, 0, m_iShmSize);
复制代码

作者: xhl    时间: 2004-04-28 17:59
标题: 关于共享内存的使用提问,急~~~~~~~~~~~~~~`
[quote]原帖由 "windflowers1976"][/quote 发表:


还是不行啊,如果遮藏起动我的、程序和上次启动之间,管理员把我自己的 配置文件改变了(配置文件里有关于共想内存大小的记录),就是我共享内存的大小有了变化,我的程序还是不能正常运行。

我想出我那个办法也是实在没有别的办法了啊。只是觉得老是这样删除创建,会不会shmid数字过大,或者系统对这个有什么限制什么的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2