玩 shmat 和 shm_open
Playing with shmat and shm_open
我刚刚阅读了 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),难道我不能从任何进程访问共享内存吗?
shm_open
属于POSIX共享内存API; shmat
属于较旧的 SysV 共享内存 API。 POSIX shm 使用文件描述符。 SysV shm 使用存在于单独 space 中的标识符。他们不一起工作。
要成功使用 SysV shm,您必须使用 shmget
获取标识符,您可以 shmat
。
要成功使用 POSIX shm,您必须 mmap
从 shm_open
获得的文件描述符。
我刚刚阅读了 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),难道我不能从任何进程访问共享内存吗?
shm_open
属于POSIX共享内存API; shmat
属于较旧的 SysV 共享内存 API。 POSIX shm 使用文件描述符。 SysV shm 使用存在于单独 space 中的标识符。他们不一起工作。
要成功使用 SysV shm,您必须使用 shmget
获取标识符,您可以 shmat
。
要成功使用 POSIX shm,您必须 mmap
从 shm_open
获得的文件描述符。