2015-02-04 24 views
-2

這裏是下面的代碼片段,我不知道爲什麼這不工作文件沒有使用正確關閉fcntl.h接近

但輸出我得到的是

-1 
-1 

代碼

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <ctime> 

int main() 
{ 

    int fd = open("/home/felipe/gdelt/fixed/test.bin", O_APPEND|O_WRONLY|O_CREAT); 
    std::cout<<close(fd)<<std::endl; 
    fd = open("/home/felipe/gdelt/fixed/test.bin", O_APPEND|O_WRONLY|O_CREAT); 
    std::cout<<fd<<std::endl; 
    //testWrite(); 
    return 0; 
} 

修改後的代碼(添加模式是使其工作的原因)

int main() 
{ 

    int fd = open("/home/felipe/gdelt/fixed/test.bin", O_APPEND|O_WRONLY|O_CREAT,S_IWUSR); 
    std::cout<<close(fd)<<std::endl; 
    fd = open("/home/felipe/gdelt/fixed/test.bin", O_APPEND|O_WRONLY|O_CREAT,S_IWUSR); 
    std::cout<<fd<<std::endl; 
    //testWrite(); 
    return 0; 
} 
+3

如果指定了'O_CREAT',則必須向'open()'提供第三個參數。忽略它會導致未定義的行爲(也許該函數從堆棧讀取垃圾值,並且它無法對其讀取的任何無意義的任意值執行任何操作。) –

+1

正如代碼所示,打開失敗...所以當然嘗試關閉fd -1將失敗。 – vanza

+1

在關閉文件之前,在單獨的打印操作('std :: cout << fd <<'\ n';')中打印'fd'。和/或打印'errno'或'strerror(errno)'。在C++代碼上看到C標籤也很奇怪,並且很奇怪它正在被編譯而沒有包含'' - 可能是某種東西,或許是'',它正在爲你包括它。 –

回答

2

一些報價從man 2 open。使用O_CREAT標誌時,必須指定第三個mode參數。

int open(const char *pathname, int flags); 
int open(const char *pathname, int flags, mode_t mode); 

模式指定的權限中創建一個新的文件的情況下使用。在標誌中指定O_CREAT時,必須提供此參數;如果未指定O_CREAT,則模式將被忽略。

這是您的第一個失敗的open系統調用。 close只是因爲您試圖在無效的文件描述符-1上使用它而失敗。

+0

謝謝我改變了代碼,包括模式和這工作proplery – flip