我刚刚阅读了shm_open
和shmat
的联机帮助页,并尝试了以下示例。在我做的文件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),我是否应该能够从任何进程访问共享内存?
答案 0 :(得分:2)
shm_open
属于POSIX共享内存API; shmat
属于较旧的SysV共享内存API。 POSIX shm使用文件描述符。 SysV shm使用存在于单独空间中的标识符。他们不能一起工作。
要成功使用SysV shm,您必须使用shmget
获取可以shmat
的标识符。
要成功使用POSIX shm,您必须mmap
从shm_open
获取的文件描述符。