#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/