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

kai*_*kai 2 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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 10

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

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

  • 这也是为什么删除所有巨大的未旋转日志文件不会释放`/ var`直到你杀死那些打开这些文件的东西 (5认同)