2011-12-06 17 views
6

mã:!Tại sao ghi vào bộ mô tả tệp sau khi tệp đích đã bị xóa thành công?

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); 
} 

trong giấc ngủ(), bạn xóa các test.txt, nhưng quá trình viết thành công tại sao? nếu một bản ghi "Singleton" thể hiện, bạn loại bỏ các tập tin trên disk.write là thành công, nhưng bạn có thể nhận được gì.

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. 
} 

"hủy liên kết" không thể giải quyết vấn đề này.

+0

Tệp tồn tại, đó chỉ là mẹo xóa được sử dụng để tạo tệp tạm thời bị ẩn bị xóa trên thực tế (close /)(). – moshbear

+1

Không có tệp tạm thời ẩn nào được thực hiện. Có một tệp không có tên, và có inode của nó với số tham chiếu! = 0. –

+0

@MaximYegorushkin: inode trên đĩa có 0 nlink. Các inode trên hạt nhân có! = 0 refcount. Nếu hệ thống bị treo, lần sau 'fsck' chạy, nó sẽ thông báo 0 nlinks và dtime = 0 và xóa tệp. – ninjalj

Trả lời

12

Các manual page for unlink(2) bang rõ:

unlink() xóa tên khỏi hệ thống tập tin. Nếu tên đó là liên kết cuối cùng đến một tệp và không có quá trình nào thì tệp mở tệp bị xóa và không gian được sử dụng sẽ được cung cấp để sử dụng lại.

Nếu tên là mắt xích cuối cùng vào một tập tin nhưng bất kỳ quy trình vẫn có tập tin mở file sẽ vẫn tồn tại cho đến khi cuối cùng tập tin mô tả đề cập đến nó được đóng lại.

Như caf ghi chú xuất sắc trong các ý kiến:

Các write() là thành công vì nó ghi vào tập tin, mà vẫn tồn tại vào thời điểm này mặc dù nó không còn có một cái tên. Tên tệp và bản thân tệp là khác biệt và có thời gian hoạt động riêng.

+2

Điều này có nghĩa là: 'write()' thành công vì nó ghi vào tệp, vẫn còn tồn tại tại thời điểm này mặc dù nó không còn có tên. Tên tệp và chính tệp đó là khác biệt và có thời gian tồn tại riêng biệt. – caf

+0

@caf Cảm ơn. Tôi kết hợp bình luận của bạn trong câu trả lời của tôi. – cnicutar

+0

về quy trình, cách biết tệp đã bị xóa? – OCaml

Các vấn đề liên quan