2015-05-14 41 views
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時,一切都很好

+0

'perror()'或'strerror()'爲您提供了一個適合於'errno'的人類可讀的錯誤消息。 – EOF

+0

EINVAL表示賦予函數的參數不適用。是否將fsync()記錄爲支持目錄文件描述符?我猜不會。順便說一句:你的宏都不是必需的,而是使用內聯函數。 –

+0

@UlrichEckhardt:「*是否將fsync()記錄爲支持目錄文件描述符?」是的,似乎是這樣。從Linux的'man fsync()':「* ...該目錄的文件描述符上的顯式fsync()也是 所需的。*」 – alk

回答

0

在我的情況下,問題是因爲我有Ubuntu安裝在VirtualBox中,我從共享文件夾運行我的程序。共享VirtualBox的vboxsf文件系統不支持文件夾上的fsync。感謝@twalberg