【问题标题】:Playing with shmat and shm_open玩弄 shmat 和 shm_open
【发布时间】:2015-03-01 00:15:45
【问题描述】:

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

【问题讨论】:

    标签: c linux linux-kernel shared-memory


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多