玩 shmat 和 shm_open

Playing with shmat and shm_open

我刚刚阅读了 shm_openshmat 的联机帮助页,并正在尝试以下示例。在文件中 test.c 我做,

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 = shm_open(name, O_CREAT|O_RDWR, 0666);
  return shmid;
}

int main() {
  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);
}

我尝试在 test.c 处添加一个 strerror(errno),我得到了 Identifier removed。这意味着什么?我究竟做错了什么?给定共享内存标识符 (shmid),难道我不能从任何进程访问共享内存吗?

shm_open属于POSIX共享内存API; shmat 属于较旧的 SysV 共享内存 API。 POSIX shm 使用文件描述符。 SysV shm 使用存在于单独 space 中的标识符。他们不一起工作。

要成功使用 SysV shm,您必须使用 shmget 获取标识符,您可以 shmat

要成功使用 POSIX shm,您必须 mmapshm_open 获得的文件描述符。