我试图在首次成功执行 shm_open 和 ftruncate 后超出共享内存对象。这是代码,
char *uuid = GenerateUUID();
int fd = shm_open(uuid, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
if(fd == -1) perror("shm_open");
size_t shmSize = sizeof(container);
int ret = ftruncate(fd, shmSize);
perror("ftruncate first");
ret = ftruncate(fd, shmSize * 2);
perror("ftruncate second");
它可以通过第一个 ftruncate,但对于第二个 ftruncate,它会失败,并出现 errno=22,“无效参数”。
我还尝试在 mmap 之后 ftruncate 内存对象,请参阅 ftruncate 的手册页,共享内存应格式化为零到新长度。
此外,我还尝试在子进程中ftruncate内存对象(这是两个进程之间的IPC主题),ftruncate返回“无效的fd,没有这样的文件或目录”,但我可以在子进程中成功shm_open和mmap。
有任何想法吗?谢谢!
我认为这是一个众所周知的“特征”shm_open()
, ftruncate()
, mmap()
.
你必须ftruncate()
第一次通过给共享内存一个长度,但随后的时间ftruncate()
给出错误号 22,您可以忽略它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)