这是我等待共享内存的两个文件,一个是写数据共享内存,另一个是从共享内存和printf数据中读取数据;但是有一些错误。
嘘嘘
#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;
}
嘘嘘
#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文件时,第一次就可以了。
不幸的是,从现在起,我发现她说得对:
shmid=65537,pid=7116。
但当我运行shm_r.c时,出现错误:
shmat返回NULL,errno(22:无效参数)
所以我不知道发生了什么?我试图解决它,例如使用ipcs-m,但没有出现shmid。
和I 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。
祝你好运!
如果你知道,请告诉我怎么解决这个问题,谢谢!
最佳答案
我已下载并运行您的程序,无法复制您的[冲突的]结果。
要列出活动的shm段,请使用ipcs
命令。如果需要删除创建的,可以使用ipcrm
命令。
有两件事我能想到,这可能是一个问题,但我打折他们,因为你说,你成功运行的第一次。
对段的权限,因为您第一次错误地创建了它。ipcs
应该显示这个。
在调试writer程序时,它可能做了一些不正确的事情。这可以通过ipcs
看到。如果出现错误,可以使用ipcrm
手动删除段,然后重试程序。
另一种可能是键与另一个程序创建的其他段冲突。这不太可能有两个原因。
你的钥匙可能是独一无二的。这也可以用ipcs
检查
现在大多数程序使用的键是0x00000000,这是“私有”模式。这是在程序执行fork
但不执行execvp
时完成的。孩子只是调用一些函数(例如child_worker
)。父母和孩子使用“私有”段来回传递数据。因为段是私有的,所以不必担心有一个唯一的键值。
因为您有两个独立的程序,使用该模式对您的用例不起作用。您需要一个非零的键值,这样您的段将从一个程序调用持续到下一个程序调用。
为了简单起见,我将两个程序合并为一个程序。我还添加了一个删除shm段的选项。
注:我只做了整容。我没有修理任何虫子。所以,这只是我在系统上测试的一个参考:
#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX_MEM 4096
#define XID 0x12367
int opt_cmd;
void
writer(void)
{
int shmid;
void *mem;
shmid = shmget(XID,MAX_MEM,IPC_CREAT | 0666);
printf("shmid is = %d,pid=%d\n",shmid,getpid());
mem = shmat(shmid,NULL,0);
if (mem == (void *) -1) {
printf("attach faile.\n");
}
strcpy((char *) mem,"Hello,this is test memory.\n");
shmdt(mem);
}
void
reader(void)
{
int shmid;
void *mem;
shmid = shmget(XID,MAX_MEM,0);
mem = shmat(shmid,NULL,0);
// printf("%s\n",(char*)mem);
if (mem == (void *) -1) {
fprintf(stderr,"shmat return NULL ,errno(%d:%s)\n",
errno,strerror(errno));
exit(2);
}
printf("%s\n",(char *) mem);
shmdt(mem);
}
void
clean(void)
{
int shmid;
shmid = shmget(XID,MAX_MEM,0);
shmctl(shmid,IPC_RMID,NULL);
}
// main -- main program
int
main(int argc,char **argv)
{
char *cp;
--argc;
++argv;
for (; argc > 0; --argc, ++argv) {
cp = *argv;
if (*cp != '-')
break;
switch (cp[1]) {
case 'd':
case 'w':
case 'r':
opt_cmd = cp[1];
break;
default:
break;
}
}
switch (opt_cmd) {
case 'w':
writer();
break;
case 'd':
clean();
break;
default:
reader();
break;
}
return 0;
}