共享内存问题 shmat返回值与ipcs -m 值不一致

玉生香 玉生香 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <strings.h>

#define err_abort(code,text) do { \
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
text, __FILE__, __LINE__, strerror (code)); \
abort (); \
} while (0)
#define errno_abort(text) do { \
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
text, __FILE__, __LINE__, strerror (errno)); \
abort (); \
} while (0)


key_t shm_key = -1;
int shm_id;



struct INFORMATION
{
int Inf_No;//编号
int Inf_Information;//信息
bool Inf_IsFill;
};

INFORMATION* pShmHead = NULL;
INFORMATION* pShmTail = NULL;


/*共享内存操作*/
bool GetShm(key_t & shm_key,const int &flag)
{
if( (shm_id = shmget(shm_key,sizeof(INFORMATION)*5,IPC_CREAT|IPC_EXCL|flag)) == -1)
{
if(errno == EEXIST)
{
if(shmget(shm_key,sizeof(INFORMATION)*5,flag)>-1)
{
return true;
}
}
err_abort(errno,"Create share memory");
}
return true;
}

bool AttacheShm(key_t& shm_id,const void *shmaddr,const int &flag)
{
if((pShmHead = (INFORMATION*)shmat(shm_id,shmaddr,flag)) == NULL)
err_abort(errno,"Attache share memory");
return true;
}


bool DeacheShm(const void *shmaddr)
{
if(shmdt(shmaddr)==-1)
err_abort(errno,"DeacheShm share memory");
return true;
}


bool RemoveShm(key_t& shm_key)
{
if(shmctl(shm_key, IPC_RMID, NULL) == -1)
err_abort(errno,"RemoveShm share memory");
return true;
}


/*
void * routine(void* arg)
{
INFORMATION* p ;
for(p = pShmHead;p!=pShmTail;p++)
{
printf("%d,%d,%d\n",p->Inf_No,p->Inf_Information,p->Inf_IsFill);
}
DeacheShm(pShmHead);
}
*/


//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int main()
{
GetShm(shm_key,0664);
AttacheShm(shm_id,NULL,0);
//pShmTail = pShmHead+5;
//pShmHead->Inf_Information = 0;
//pShmHead->Inf_IsFill = 1;
//pShmHead->Inf_No = 0;
printf("head %p tail %p\n", pShmHead,pShmTail);
//pthread_t thread;
//if(pthread_create(&thread,NULL,routine,NULL)!=0)
// err_abort(errno,"pthread_create");
//pthread_join(thread,NULL);
while(1)
;
//DeacheShm(pShmHead);

}

程序输出
head 0xb7f87000 tail (nil)

ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0xffffffff 1409025 xpston 664 60 1

第二次启动输出
head 0xffffffff tail (nil)

这种情况是因为什么原因产生的。求高手解答

...全文

相关推荐

Linux共享内存详解[源码]

值得注意的是,共享内存本身并不提供任何同步机制,这意味着多个进程在并发访问同一内存区域时极易引发竞态条件、数据覆盖或不一致等问题,因此必须配合信号量、互斥锁或文件锁等外部同步原语共同使用,以确保临界区的安全性与原子性

s3t4u

Linux编程:多进程间通过shmget共享内存

在开发过程中,有时会需要在多个进程间共享一部分数据,当数据量较大时,SYS V共享内存是一个不错的选择。低两个字节与open函数的mode保存一致,即分别代表同组的读写权限和其他用户的读写权限。IPC_CREAT:若key标识的共享内存不存在,则创建;------------ 共享内存段 --------------shmaddr:希望映射到的地址,通常填0,由操作希望进行分配。IPC_EXCL:若key标识的共享内存已经存在,则返回错误。--------- 消息队列 -----------

静静地躺着

JEP30-PX100A PartModel Product Guidelines for Electronic-Device Substrates and Assemblies – XML Requ

JEP30-PX100A PartModel Product Guidelines for Electronic-Device Substrates and Assemblies – XML Requirements

cdming

基于Matlab的自动睡眠粒状结构检测算法,从脑电信号中进行。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

海神之光

JEP375 2.5D_3D Silicon thinned wafers with Through Silicon Vias (TSV’s) and Backside Redistribution

JEP375 2.5D_3D Silicon thinned wafers with Through Silicon Vias (TSV’s) and Backside Redistribution Layer (RDL).pdf

Red Car
评论 1
收藏 已收藏
分享
返回顶部
玉生香
C++ 语言 65,214 成员 250,514 内容