在共享内存使用过程中出现了shmat函数Identifier removed 错误,通过#ipcs -m 可以看到shmget开辟的内存空间,且有shmid,但自己定义的变量shmid确一直为0,造成shmat的错误。
void * set_web_shm(void)
{
int shmid;
void * shmaddr=(void *)0;
if(shmid=shmget((key_t)112233,sizeof(struct sys_all),0666|IPC_CREAT)<0){
printf("shmget() error\n");
return NULL;
}
shmaddr=shmat(shmid,(void *)0,0);
printf("shmadd=%d\n",shmaddr);
if(shmaddr==(void*)-1){
perror("shmat() error!709\n");
return NULL;
}
printf("set shm ok...,shmadd=%d\n",(int)shmaddr);
return shmaddr;
}
排了一天的错发现:
if(shmid=shmget((key_t)112233,sizeof(struct sys_all),0666|IPC_CREAT)<0)
这句话中少了一对括号,造成了先运行
shmget((key_t)112233,sizeof(struct sys_all),0666|IPC_CREAT)<0
然后将逻辑表达式的值赋予shmid,当然为0了!!!!
可奇怪的是我tiny6410上是可以正常运行的,但到了我VMware 和nanopi 2s上确不行。
分析这可能是tiny6410的arm-linux-gcc、gcc、arm-linux-gnueabihf-gcc编译器对运算符优先级的问题吧
解决这个问题很简单先赋值后比较就ok了,也就是加一个括号
if((shmid=shmget((key_t)112233,sizeof(struct sys_all),0666|IPC_CREAT))<0)
搞定!