玩shmat和shm_open

时间:2015-03-01 00:15:45

标签: c linux linux-kernel shared-memory

我刚刚阅读了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),我是否应该能够从任何进程访问共享内存?

1 个答案:

答案 0 :(得分:2)

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

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

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