czq1024 2017-12-01 02:25 采纳率: 50%
浏览 1254
已采纳

共享内存映射的进程空间shmat函数返回是什么

是共享内存的物理地址,还是进程的虚拟地址,如果是父子进程分别映射呢?返回地址一样吗?有点晕

看一下代码
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 2048

int main()
{
pid_t pid;
int shmid;
char *shm_addr;
char flag[] = "WROTE";
char buffer[BUFFER_SIZE];

if((shmid = shmget(IPC_PRIVATE,BUFFER_SIZE,0666)) < 0)
{
perror("shmget");
exit(-1);
}
else
{
printf("Create shared-memory:%d\n",shmid);
}

system("ipcs -m");
pid = fork();
if(pid < 0)
{
perror("fork error");
exit(-1);
}
else if(pid == 0)
{
shm_addr = shmat(shmid,0,0);
if(shm_addr == (void *)-1)
{
perror("Child:shmat");
exit(-1);
}
else
{
printf("Child:Attach shared-memory:%p \n",shm_addr);
}

system("ipcs -m");

while(strncmp(shm_addr,flag,strlen(flag)))
{
printf("Child:wait for enable data...\n");
sleep(5);
}

strcpy(buffer,shm_addr + strlen(flag));
printf("Child:shared-memory:%s\n",buffer);

if((shmdt(shm_addr)) < 0)
{
perror("shmdt");
exit(-1);
}
else
{
printf("Child: Deattach shared-memory\n");
}
system("ipcs -m");

if(shmctl(shmid,IPC_RMID,NULL) == -1)
{
perror("Child:shmctl(IPC_RMID)");
exit(-1);
}
else
{
printf("Delete shmared-memory\n");
}

system("ipcs -m");
}
else
{
if((shm_addr = shmat(shmid,0,0)) == (void *)-1)
{
perror("parent:shmat");
exit(-1);
}
else
{
printf("Parent:Attach shmared-memory:%p\n",shm_addr);
}

sleep(1);
printf("\nInput some string:\n");
fgets(buffer,BUFFER_SIZE,stdin);
strncpy(shm_addr + strlen(flag),buffer,strlen(buffer));
strncpy(shm_addr,flag,strlen(flag));

if((shmdt(shm_addr)) < 0)
{
perror("Parent:shmdt");
exit(-1);
}
else
{
printf("Parent : Deattach shared-memory\n");
}

system("ipcs -m");
waitpid(pid,NULL,0);
printf("Finsihed\n");
}

return 0;
}

运行结果
Create shared-memory:196613

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

0x00000000 0 fs 700 76800 2 dest

0x00000000 32769 fs 700 1843200 2 dest

0x00000000 65538 fs 700 20196 2 dest

0x00000000 98307 fs 700 17028 2 dest

0x00000000 131076 fs 700 19800 2 dest

0x00000000 196613 fs 666 2048 0

Parent:Attach shmared-memory:0xb773d000
Child:Attach shared-memory:0xb773d000

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

0x00000000 0 fs 700 76800 2 dest

0x00000000 32769 fs 700 1843200 2 dest

0x00000000 65538 fs 700 20196 2 dest

0x00000000 98307 fs 700 17028 2 dest

0x00000000 131076 fs 700 19800 2 dest

0x00000000 196613 fs 666 2048 2

Child:wait for enable data...

Input some string:
xiaoqiang
Parent : Deattach shared-memory

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

0x00000000 0 fs 700 76800 2 dest

0x00000000 32769 fs 700 1843200 2 dest

0x00000000 65538 fs 700 20196 2 dest

0x00000000 98307 fs 700 17028 2 dest

0x00000000 131076 fs 700 19800 2 dest

0x00000000 196613 fs 666 2048 1

Child:shared-memory:xiaoqiang

Child: Deattach shared-memory

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

0x00000000 0 fs 700 76800 2 dest

0x00000000 32769 fs 700 1843200 2 dest

0x00000000 65538 fs 700 20196 2 dest

0x00000000 98307 fs 700 17028 2 dest

0x00000000 131076 fs 700 19800 2 dest

0x00000000 196613 fs 666 2048 0

Delete shmared-memory

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

0x00000000 0 fs 700 76800 2 dest

0x00000000 32769 fs 700 1843200 2 dest

0x00000000 65538 fs 700 20196 2 dest

0x00000000 98307 fs 700 17028 2 dest

0x00000000 131076 fs 700 19800 2 dest

Finsihed

  • 写回答

4条回答 默认 最新

  • qq_41242687 2017-12-01 13:05
    关注

    啥叫物理地址?都是虚拟的啊。反正就是返回一个地址,你就用这个地址就行了,就是你进程空间的地址。
    如果是两个不同进程,那么地址是自己的,大家看见自己的不同虚拟地址,实际上访问的是同一块物理内存。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型