在C语言中,ftruncate函数与POSIX共享内存段相关。

3
这里的最终目标是扩展共享内存段的大小并通知进程在扩展后重新映射该段。然而,似乎在共享内存fd上第二次调用ftruncate会失败,并显示EINVAL错误。我找到的仅有的其他问题没有答案:ftruncate failed at the second time ftruncate和shm_open的手册没有提到在创建后禁止扩展共享内存段,实际上它们似乎通过ftruncate可以调整大小,但到目前为止我的测试表明不是这样。我能想到的唯一解决方案是销毁共享内存段并以更大的大小重新创建它,但这将要求所有已经映射该段的进程在对象被销毁并可重新创建之前取消映射。
有什么想法吗?谢谢!
编辑:如所请求的简单示例
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>

int main(int argc, char *argv[]){
    const char * name = "testfile";
    size_t sz = 4096; // page size on my sys
    int fd;
    if((fd = shm_open(name, O_CREAT | O_RDWR, 0666)) == -1){
        perror("shm_open");
        exit(1);
    }
    ftruncate(fd, sz);
    perror("First truncate");
    ftruncate(fd, 2*sz);
    perror("second truncate");

    shm_unlink(name);
    return 0;
}

输出:

First truncate: Undefined error: 0
second truncate: Invalid argument

编辑 - 回答:看起来这是OSX对POSIX标准实现的问题,上面的代码片段适用于3.13.0-53通用GNU/Linux内核和其他可能的内核。

根据 man 7 shm_overview,您可以对 SHM 对象进行 ftruncate。因此,您的代码可能存在问题,请创建一个 [mcve]。 - Colonel Thirty Two
@ColonelThirtyTwo 已发布示例。 - jot
1
我无法复现;这段代码片段对我来说运行良好。 - Colonel Thirty Two
@ColonelThirtyTwo,你用的是什么系统?我现在有问题的猜测了。 - jot
请确保ftruncate返回-1。否则,errno无效。 - nneonneo
看起来这是一个OSX的问题,这很棒,因为代码不会在OSX系统上部署。感谢您的反馈@ColonelThirtyTwo! - jot
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接