3
任何人都可以解释为什么fsync可以返回EINVAL时,我通过文件夹描述符?这里是我的代码,它是非常简单的:新创建的文件夹上的fsync?
#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'的人类可读的错误消息。 – EOF
EINVAL表示赋予函数的参数不适用。是否将fsync()记录为支持目录文件描述符?我猜不会。顺便说一句:你的宏都不是必需的,而是使用内联函数。 –
@UlrichEckhardt:“*是否将fsync()记录为支持目录文件描述符?”是的,似乎是这样。从Linux的'man fsync()':“* ...该目录的文件描述符上的显式fsync()也是 所需的。*” – alk