【问题标题】:ftruncate failed at the second timeftruncate 第二次失败
【发布时间】:2013-12-17 17:09:52
【问题描述】:

我试图在 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,它超过 failed with errno=22, "Invalid argument"。

我也试过在mmap之后对内存对象进行ftruncate,参考ftruncate的man page,共享内存应该格式化为零到新长度。

此外,我还尝试在子进程中对内存对象进行 ftruncate(这是两个进程之间的 IPC 主题),ftruncate 返回“无效 fd,没有这样的文件或目录”,但我可以在子进程中成功 shm_open 和 mmap过程。

有什么想法吗?谢谢!

【问题讨论】:

  • 还是没有找到任何原因,只好临时解决:如果ftruncate失败,关闭并shm_unlink对象,新建一个同名文件描述符,ftruncate新对象,通过了。

标签: unix mmap


【解决方案1】:

我认为这是shm_open()ftruncate()mmap() 的已知“功能”。

您必须在第一次通过ftruncate() 为共享内存指定长度,但随后ftruncate() 给出的错误编号为 22,您可以忽略它。

【讨论】:

  • 它并不能真正解释观察到的行为。该链接与从另一个进程调用的 ftruncate() 错误有关。
【解决方案2】:

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

如果文件之前小于这个大小,ftruncate() 将 要么增加文件的大小,要么失败。

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 2011-03-22
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2015-09-02
    • 2014-07-12
    相关资源
    最近更新 更多