ftruncate第二次失败

时间:2013-12-02 04:16:43

标签: unix mmap

我试图在shm_open和ftruncate fisrt成功后超过共享内存对象。这是代码,

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过程

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为这是一个已知的"功能" shm_open()ftruncate()mmap()

首次通过ftruncate()为共享内存提供长度,但后续ftruncate()会给出错误编号22,您可以忽略它。

答案 1 :(得分:0)

使用的实现似乎符合较早的specification,当ftruncate(fd, length)超过以前的长度时,返回错误是length允许的行为:

  

如果之前的文件小于此大小, ftruncate ()必须   要么增加文件的大小,要么失败。