使用shmget和shmat时页面获取(删除)

时间:2015-03-01 01:38:36

标签: c linux linux-kernel shared-memory

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

代码如下: -

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中运行包装器程序,拦截execve,调试测试程序,看看shmget成功;然后检查它的/ proc / pid / maps,我看到对应于shmget的页面显示为“(Deleted)”。为什么会这样?我做错了什么?

1 个答案:

答案 0 :(得分:1)

没有错;没有被删除。 (Deleted)表示法就是Linux如何表示文件系统中没有命名链接的文件的映射。