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

时间:2012-04-19 14:41:14

标签: c linux

我有一个问题,为什么在从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);
}

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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