code:
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”实例,则删除磁盘上的文件。写入成功,但什么也得不到。
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.
}
“取消链接”无法解决这个问题。
The 取消链接的手册页(2) http://www.kernel.org/doc/man-pages/online/pages/man2/unlink.2.html明确指出:
unlink()
从文件系统中删除名称。如果这个名字是
到文件的最后一个链接,并且没有进程打开该文件,该文件是
已删除,并且其所使用的空间可供重复使用。
如果该名称是文件的最后一个链接,但任何进程仍然有
文件打开该文件将一直存在,直到最后一个文件
引用它的描述符已关闭.
As caf https://stackoverflow.com/users/134633/caf评论中很好地指出:
write() 成功,因为它写入了文件,该文件仍然
尽管它不再有名字,但此时仍然存在。文件名
文件本身是不同的,并且有不同的生命周期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)