【问题标题】:Pages getting (deleted) when using shmget and shmat使用 shmget 和 shmat 时获取(删除)的页面
【发布时间】:2015-03-01 01:38:36
【问题描述】:

我编写了以下 2 个测试程序,一个使用 shmat,另一个使用 shmget,execve 是第一个二进制文件。

代码如下:-

int main(int argc, char **argv) {
  void *retval;
  long shmid = atol(argv[1]);

  retval = shmat(shmid, NULL, SHM_RDONLY);
  printf("%p\n", retval);
}

还有包装文件,

int setupshm(char *name) {
  int shmid;
  shmid = shmget(IPC_PRIVATE, 100, IPC_CREAT|0666);
  return shmid;
}

int main() {

  int pid = fork();
  if (pid == 0) {
  char **envp = NULL;
  char *argv[3];
  char num[10];

  sprintf(num, "%d", setupshm("whatever"));

  argv[1] = "./test";
  argv[2] = num;
  argv[3] = NULL;

  execve("./test", argv, envp);
}

else { int status; wait(pid, &status, 0); }
}

我在gdb中运行wrapper程序,拦截execve,调试测试程序,看到shmget成功;然后检查它的 /proc/pid/maps,我看到与 shmget 对应的页面显示为“(已删除)”。为什么会这样?我做错了什么?

【问题讨论】:

  • 在分叉调用之前移动setupshm()。在当前版本中。您正在孩子中创建 shm,然后您正在用新进程覆盖孩子。这就是内存被标记为删除的原因。

标签: c linux linux-kernel shared-memory


【解决方案1】:

没有错;什么都没有被删除。 (Deleted) 表示法正是 Linux 表示文件系统中没有命名链接的文件映射的方式。

【讨论】:

  • 您可以从ipcs 命令获取有关SysV IPC 对象的一些附加信息,包括“标记为删除”标志的真实状态(在status 列中显示为dest )。此外,当您意识到您还剩下多少未使用的 shm 段时,您可能会对 ipcrm 命令感兴趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多