#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(void)
{
    FILE *fh = fopen ("file.txt", "w");
    if (fh != NULL) {
        int i = 0;
        while(i < 5){
            if (fprintf (fh, "%s", "hello") < 0)
            {
                fprintf (stderr, "err=%d: %s\n", errno, strerror (errno));
            }
            if(ferror(fh))
            {
                printf("wrong\n");
            }
            sleep(10);
        }
    }
    return(0);
}


当我在程序运行期间删除文件“ file.txt”时,我希望fprintf返回小于0的值以打印错误消息。但是fprintf始终会返回“ hello”字符串的大小,即5。

注意:由于有10秒钟的睡眠呼叫,因此在程序终止之前我删除了该文件。

如果fprintf / fwrite写入不再存在的文件(由文件描述符指向),请澄清如何产生错误消息。

最佳答案

在类似UNIX的系统上,“删除”文件不会物理删除磁盘上的文件。它只会将其链接数减少1。直到删除该文件的最后一个链接,该文件才被删除。这就是为什么rm命令调用的系统调用称为unlink的原因。 man 2 unlink了解更多信息。

如果创建到文件的硬链接,则可以看到这种情况的一个后果:

echo "hello" > file0
ln file0 file1
rm file0


rm file0命令意味着该文件不再通过该名称可见,但仍通过其其他名称file1可见。如果再按rm file1,则实际文件将最终消失。

防止文件被删除的另一种方法是使进程打开。您的程序将创建一个文件,并创建一个名称为"file.txt"的目录条目。在程序外键入rm file.txt时,将删除目录条目,而不是文件。您的程序仍然可以写入文件。它甚至可以搜索到文件的开头并再次读取它。

如果您的程序调用fclose(fh)或终止(隐式关闭所有打开的文件),则对磁盘文件的最后一个引用将消失,并且磁盘上的实际文件将被删除。

非UNIX系统(例如Windows)的行为可能会有所不同。

关于c - fprintf的返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29931016/

10-12 15:14