C 为什么在删除目标文件后写入文件描述符会成功?
代码: 在sleep()过程中,您删除了test.txt,但进程写入成功!为什么? 如果日志为“Singleton”实例,则删除磁盘上的文件。write成功,但无法获得任何结果C 为什么在删除目标文件后写入文件描述符会成功?,c,linux,C,Linux,代码: 在sleep()过程中,您删除了test.txt,但进程写入成功!为什么? 如果日志为“Singleton”实例,则删除磁盘上的文件。write成功,但无法获得任何结果 int main(int argc, char **argv) { int fd = open("test.txt", O_CREAT|O_RDWR, 0200|0400); if(fd == -1) { printf("failure to oepn"); exi
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);
}
“取消链接”无法解决此问题。状态清楚:
unlink()
从文件系统中删除一个名称。如果该名称是
指向文件的最后一个链接,并且没有进程打开该文件,则该文件处于打开状态
删除并使其使用的空间可供重用
如果名称是指向文件的最后一个链接,但任何进程仍有
文件打开该文件将一直存在,直到最后一个文件
引用它的描述符已关闭
正如评论中出色地指出的:
write()之所以成功,是因为它会写入文件,而该文件
此时存在,即使它不再有名称。文件名
文件本身是不同的,并且有不同的生存期
文件存在,只是使用删除技巧生成一个隐藏的临时文件,该文件在close()/exit()时被物理删除。没有隐藏的临时文件。有一个没有名字的文件,还有一个引用计数为!=0的inode。@MaximYegorushkin:磁盘上的inode有0 nlink。内核上的inode有!=0 refcount。如果系统崩溃,下次运行
fsck
时,它将注意到0 nlinks和dtime=0并删除该文件。这意味着: 写()
之所以成功,是因为它写入了该文件,而该文件现在仍然存在,尽管它不再有名称。文件名和文件本身是不同的,并且有单独的生命周期。@caf谢谢。我在回答中加入了您的评论。在这个过程中,如何知道该文件已被删除?@user952069您可以使用inotify进行监视
或类似于FAM
的库。有意思的是,python使用该功能创建安全的临时文件。创建一个临时文件,生成一个描述符,然后立即取消该文件的链接,这样它就不能被另一个进程打开。只要python进程保留描述符,该文件就会保持不变可以写入/读取。但是,只要进程释放描述符,该文件就会“永远”消失。
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.
}