免费注册 查看新帖 |

Chinaunix

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

关于共享内存的使用提问,急~~~~~~~~~~~~~~` [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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

论坛徽章:
0
2 [报告]
发表于 2004-04-28 12:02 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

加上权限
IPC_CREATE | SHM_W | SHM_R | 0777

试试

论坛徽章:
0
3 [报告]
发表于 2004-04-28 12:36 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

谢谢,不过还是不行,返回值仍然是-1
还有可能是什么其他原因吗?

论坛徽章:
0
4 [报告]
发表于 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;
}

论坛徽章:
0
5 [报告]
发表于 2004-04-28 13:01 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

看errno不就知道为什么了吗?

论坛徽章:
0
6 [报告]
发表于 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的缘故

论坛徽章:
0
7 [报告]
发表于 2004-04-28 13:31 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

原帖由 "飞灰橙" 发表:

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

呵呵,不能创建已经创建的SHM不是对我自己的代码说的,是回复上述问题用的.
我的意思是请参考我贴出的代码,两边都调用上述的SHMGET,这样就没有问题了,上述代码也是久经考验的,呵呵.
意义我解释一下,就是首先尝试创建共享内存,设置IPC_EXCL标志,如果返回错误是EEXIST 说明已经创建,那么我们只需要打开就行.

论坛徽章:
0
8 [报告]
发表于 2004-04-28 13:35 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

原帖由 "windflowers1976" 发表:
我的意思是请参考我贴出的代码,两边都调用上述的SHMGET,这样就没有问题了,上述代码也是久经考验的,呵呵.
意义我解释一下,就是首先尝试创建共享内存,设置IPC_EXCL标志,如果?.........


也许你还不知道,SHM的创建和打开都是用shmget,
所以加上IPC_EXCL的判断完全多余。
直接用shmget(... IPC_CREAT)不加IPC_EXCL就可以了,
这样如果该SHM不存在,则自动创建一个,如果已存在,则可以看作打开。

论坛徽章:
0
9 [报告]
发表于 2004-04-28 13:43 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

或许我是不知道,我刚好又翻了下Richard Stevens 书
UNIX 进程间通讯2卷中文版296页,
如果创建一个新的共享内存区时,必须指定一个不为零的SIZE,如果打开一个已存在的共享内存区,那么SIZE应为零.
我不知道你的观点不是不同意R S 老前辈的话.或许是我的错.
不过,你的说法我也去试验下.

论坛徽章:
0
10 [报告]
发表于 2004-04-28 13:59 |只看该作者

关于共享内存的使用提问,急~~~~~~~~~~~~~~`

原帖由 "windflowers1976" 发表:
恢?滥愕墓鄣悴皇遣煌?釸 S 老前辈的话.或许是我的错.
不过,你的说法我也去试验下.


多谢指出,我在linux上试了下,
发现打开的一方,size的值只要不超过创建的size都是可以的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP