【问题标题】:fsync on newly created folder?fsync 在新创建的文件夹上?
【发布时间】:2015-07-25 19:12:25
【问题描述】:

谁能解释为什么当我在其中传递文件夹描述符时 fsync 会返回 EINVAL?有我的代码,很简单:

#include <dirent.h>     /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <errno.h>


#define handle_error(msg) \
do { trace(msg); exit(0); } while (0)
#define trace printf


int createDir(const char* name) {
    int r = ::mkdir( name, 0777 );
    if (r != 0) {
        trace("error r!=0 %d\n",errno);
    }
    r = open(name, O_RDONLY | O_DIRECTORY);
    if (r < 0) {
        trace("error create dir r <0\n");
    }
    return r;
}

int main(int argc, const char * argv[]) {

    int r;

    int dir = createDir("test");

    r = fsync(dir);
    trace("r = %d %d\n",r,errno);
    close(dir);


    return 0;
}

它给了我这个输出:

r = -1 22

我正在使用 linux 版本。 2.6.32(我记得是 Ubuntu 10.04)

那么为什么我在文件夹上调用 fsync 时会出错?当我用传入的文件描述符调用 fsync 时,一切都很好

【问题讨论】:

  • perror()strerror() 为您提供适合 errno 的人类可读错误消息。
  • EINVAL 表示给函数的参数不合适。 fsync() 是否记录了支持目录文件描述符?我猜不会。顺便说一句:您的宏实际上都不是必需的,而是使用内联函数。
  • @UlrichEckhardt:我刚刚在 Wheezy-Debian 上尝试了 OP 的代码,但无法重现失败。 fsync() 成功。
  • O_DIRECTORY 被记录为“不应在 opendir(3) 的实现之外使用”...也许您应该改用 opendir()...
  • @Lobster 这个目录驻留在什么类型的文件系统上?也许该特定文件系统类型不支持目录上的fsync()...

标签: c linux unix


【解决方案1】:

在我的情况下,问题是因为我在 VirtualBox 中安装了 Ubuntu,并且我从共享文件夹运行我的程序。 VirtualBox 共享的 vboxsf 文件系统不支持文件夹上的 fsync。感谢@twalberg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多