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

标签 c linux linux-kernel shared-memory

我编写了以下 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 的页面显示为“(已删除)”。为什么会这样?我做错了什么?

最佳答案

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

关于c - 使用 shmget 和 shmat 时页面获取(删除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789119/

相关文章:

Clang -Wconditional-uninitialized on struct member array 赋值

linux - Emacs dirtree - 目录 TreeView 设置

基本数据类型的 copy_to_user() 和 copy_from_user()

c - 数组不打印其中的第一个字母

c - OS X - 在 C 中使用内联汇编时架构 i386 的 undefined symbol

python - Ubuntu 18.04 中的 Spyder 2

linux - 无法安装 Package::Stash::XS

linux - ioctl 命令的用户权限检查

linux - `do_new_mount_fc()`如何挂载像ext4这样的真实文件系统?

c - FFMpeg、libav、sws_scale 和 yuv 到 rgb 转换的问题 - 颜色不正确