2

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

当我在前几次成功写入后删除文件时,我期待看到 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);
}
4

3 回答 3

10

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

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

于 2012-04-19T14:44:18.833 回答
1

Linux 为所有文件保留一个计数器。如果你打开一个文件,那么它就会增加。当您删除一个文件时,计数器减一,如果计数器为零,则该文件实际上被视为已删除。

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

于 2012-04-19T14:46:19.877 回答
1

如果您 rm'd 文件,随后尝试“查找”该文件(打开它以供阅读等)将失败。您现有的进程将继续有权访问该文件,直到它终止或关闭该文件。在此之前,您的进程将可以访问写入文件的信息。之后,无法访问该信息(通过“特殊”方式除外 - 搜索“在 linux unix 中恢复已删除文件”以获取详细信息)。

于 2012-04-19T14:48:52.610 回答