Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在删除目标文件后写入文件描述符会成功?_C_Linux - Fatal编程技术网

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

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

代码:

在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");
        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. 
}