为什么在目标文件被删除后写入文件描述符成功?

码:

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

在sleep()期间,你删除了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. } 

“取消关联”无法解决这个问题。

解除链接的手册页(2)明确指出:

unlink()从文件系统中删除一个名字。 如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且正在使用的空间可供重用。

如果名称是文件的最后一个链接,但任何进程仍然打开该文件,则文件将保持存在状态,直到引用它的最后一个文件描述符被关闭

作为咖啡出色的注释在评论:

write()是成功的,因为它写入到文件中,即使它不再有名字,这个文件仍然存在。 文件名和文件本身是不同的,并有不同的生命周期。