繁体   English   中英

为什么write()在写入时删除文件时不会失败?

[英]Why write() doesn't fail when I delete the file on write?

我有一个问题,为什么在从shell中删除目标文件后,write()系统调用仍然成功写入了什么?

当我在前几次成功写入后删除文件时,我希望看到write()失败,但它没有,我不知道它写在哪里。

谁能向我解释一下,谢谢!

这是我的测试示例代码:

int fd = open ("./test.txt", O_CREAT | O_RDWR | O_APPEND, 0666);
if (fd == -1)
    error_and_exit ("open() failed");

ssize_t written = 0;
char buf[] = "apple\n";

while (true)
{
    printf ("perform write...\n");
    written = write (fd, buf, sizeof(buf));
    if (written <= 0)
        error_and_exit ("write failed");
    printf ("=> wrote %d bytes\n", written);
    printf ("sleep %d...\n\n", SLEEP_TIME);
    sleep (SLEEP_TIME);
}

文件未被物理删除(在inode级别,如果文件系统具有inode),直到最后一个打开的文件描述符在文件上关闭,即使文件没有剩余的名称引用(因为它的姓氏已被取消链接,又被删除了)。 这是为POSIX(Unix)系统创建临时但匿名文件的方法,方法是创建文件然后删除其名称。

请注意,如果您有一个守护程序进程使日志文件保持打开状态,守护程序可能会继续写入旧文件(而不是新文件),并且在守护程序终止之前不会释放该空间(或者更准确地说,关闭旧日志文件的文件描述符)。

Linux为所有文件保留一个计数器。 如果您打开一个文件,那么它会增加。 删除文件时,计数器减1,如果计数器为0,则实际上认为文件已删除。

因此,当您的程序打开文件时,计数器会从1增加到2,然后当您删除文件时,计数器会再次减少到1。 在关闭文件之前,它不会再次减少,当您执行此操作时,计数器将为零,并且将删除实际文件。

如果您对文件进行了反应,则后续尝试“查找”文件(打开文件以进行阅读等)将失败。 您的现有进程将继续访问该文件,直到它终止或关闭该文件。 在此之前,您的流程可以访问写入该文件的信息。 之后,信息无法访问(除非'非常'意味着 - 搜索'在linux unix中恢复已删除的文件'以获取详细信息)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM