这是我等待两个文件共享内存,一个是写入数据共享内存,另一个是从共享内存和printf数据读取数据;但有一些错误。共享内存错误:在CentOS6.8中,shmat返回NULL,errno(22:无效参数)
shm_w.c
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#define MAX_MEM 4096
int main()
{
int shmid;
int ret;
void* mem;
shmid=shmget(0x12367,MAX_MEM,IPC_CREAT | 0666);
printf("shmid is = %d,pid=%d\n",shmid,getpid());
mem=shmat(shmid,(const void*)0,0);
if((int)mem==-1)
{
printf("attach faile.\n");
}
strcpy((char*)mem,"Hello,this is test memory.\n");
ret=shmdt(mem);
return 0;
}
shm_r.c
#include <errno.h>
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#define MAX_MEM 4096
int main()
{
int shmid;
int ret;
void* mem;
shmid=shmget(0x12367,MAX_MEM,0);
mem=shmat(shmid,(const void*)0,0);
//printf("%s\n",(char*)mem);
if(mem==(void*)-1)
{
fprintf(stderr,"shmat return NULL ,errno(%d:%s)\n",errno,strerror(errno));
return 2;
}
printf("%s\n",(char*)mem);
shmdt(mem);
return 0;
}
当我在CentOS6.8编译会把两个.c文件,在第一时间就可以了。
不幸的是,从现在开始,我符文she_w.c是正确太:
的shmid是= 65537,PID = 7116。
但是当我运行shm_r.c,它的出现错误:
shmat return NULL ,errno(22:Invalid argument)
,所以我不知道发生什么事了吗?我试图解决它,例如使用ipcs -m,但不出现shmid。 而我cat/proc/7116/maps: “没有这样的文件或目录”
谁能告诉我发生了什么?我怎样才能在CentOS6.6上找到shmid
uname -r:
2.6.32-504.12.2.el6.x86_64
我也用cat/proc/sysvipc/shm | grep 65537,但不出现shmid。 不幸运!
请告诉我如何解决问题,如果您知道,谢谢!
'(常量无效*)0' - 使用'NULL'宏来得到一个_NULL指针constant_。 – Olaf
你是一个接一个地运行这两个程序吗?当第一个程序在另一个程序启动之前分离内存段时,您会认为会发生什么?您需要等待另一个程序运行,然后才能分离该段。 –
“你是否一个接一个地运行这两个程序?当第一个程序在另一个程序启动之前分离内存段时,你会认为会发生什么?在分离该段之前,需要等待另一个程序运行。 “为什么在读取程序后必须分离并且不能在写入程序中分离?我的意思是写程序写数据结束,它可以分离,不知为什么当写程序完成时可以使用分离。如果我在写入程序中使用detach,共享内存将被释放,所以读取程序不能读取数据? – Marcos