2011-12-06 15 views
6

代碼:爲什麼在目標文件被刪除後寫入文件描述符成功?

int main(int argc, char **argv) 
{ 
    int fd = open("test.txt", O_CREAT|O_RDWR, 0200|0400); 
    if(fd == -1) 
    { 
     printf("failure to oepn"); 
     exit(-1); 
    } 
    int iRet = write(fd, "aaaaaaaaaa", 10); 

    if(iRet == -1) 
    { 
     printf("failure to writer"); 
     exit(-1); 
    } 
    sleep(10); 
    printf("You must remove"); 
    iRet = write(fd, "bbbbbbbbbb", 10); 

    if(iRet == -1) 
    { 
     printf("failure to after writer"); 
     exit(-1); 
    } 

    exit(0); 
} 

睡眠(),刪除test.txt的,但過程中寫成功,爲什麼? 如果一個日誌爲「Singleton」實例,你刪除disk.write文件是成功的,但是你什麼也得不到。

class log 
{ 
public: 
    void loggerWriter(std::string str); 
    int fd; 
}; 

log::log(std::string filename):fd(-1) 
{ 
    fd = open(filename.c_str(), O_CREAT|) 
    //... 
} 

log::loggerWriter(std::string str) 
{ 
    writer(fd, str.c_str(), str.size()); 
} 

int main() 
{ 
    log logger("text.txt"); 
    //... 
    //I want to know the text.txt the text.txt have delete on the disk or not. 
    //if delete i can create another file to log. 
} 

「取消鏈接」無法解決此問題。

+0

該文件存在,它只是使用刪除技巧來創建一個隱藏的臨時文件,在close()/ exit()上進行物理刪除。 – moshbear

+1

沒有隱藏的臨時文件。有一個沒有名字的文件,並且其索引節點的引用計數爲!= 0. –

+0

@MaximYegorushkin:磁盤上的inode有0個鏈接。內核上的inode有!= 0 refcount。如果系統崩潰,下次運行'fsck'時,它會注意到0 nlinks和dtime = 0並刪除文件。 – ninjalj

回答

12

manual page for unlink(2)國明確:

unlink()刪除從文件系統的名稱。如果該名稱是 指向文件的最後一個鏈接,並且沒有進程打開該文件,則刪除該文件 ,並且它所使用的空間可供重用。

如果名字是最後一個鏈接到一個文件,但任何進程仍然有 開放該文件的文件將繼續存在,直到最後一個文件 描述指的是關閉

正如評論caf出色筆記:)

寫(是成功的,因爲它寫到文件,仍然存在 在這一點上,即使它不再有名字。文件名爲 和文件本身是不同的,並且具有不同的生命週期。

+2

這意味着:'write()'是成功的,因爲它寫入文件,即使它不再有名稱,該文件仍然存在。文件名和文件本身是不同的,並且具有不同的生命週期。 – caf

+0

@caf謝謝。我在你的回答中加入了你的評論。關於進程 – cnicutar

+0

,如何知道文件被刪除? – OCaml

相關問題