gpt4 book ai didi

c - 使用 shmat 和 shm_open

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:00 26 4
gpt4 key购买 nike

我刚刚阅读了 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 使用存在于单独空间中的标识符。他们不一起工作。

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

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

关于c - 使用 shmat 和 shm_open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28788569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com