在程序结束之前,文件不会写入磁盘

时间:2014-09-09 05:24:01

标签: c unix

我正在使用unix系统上的c代码编写文件。我打开它,写几行并关闭它。然后我调用一个shell脚本,比如说要使用这个文件的代码B,然后返回主程序。但是,当代码B尝试读取文件时,该文件为空。

我检查了文件系统上的文件,其大小显示为0,文件中没有数据。但是,在杀死正在运行的c代码进程后,文件中存在数据。

这是一段代码 -

void writefile(){
  FILE *fp;
  fp = fopen("ABC.txt","w");
  fputs("Some lines...\n",fp);
  fclose(fp);

  system("code_B ABC.txt");
}

请告知如何在不停止c代码过程的情况下读取shell脚本中的文件。

3 个答案:

答案 0 :(得分:3)

如果fput和fclose之间有一段时间,请添加

fflush(fp);

这将导致写入磁盘文件的内容。

答案 1 :(得分:3)

你应该在fclose()之后执行fsync(),以保证将文件写入磁盘。

看看这个问题:

Does Linux guarantee the contents of a file is flushed to disc after close()?

答案 2 :(得分:3)

内核确保写入文件的数据可以在之后的其他进程中回读,即使它尚未物理写入光盘。因此,在通常情况下,无需调用fsync() - 即使使用fsync(),文件系统也可能决定进一步延迟物理写入。

一个常见问题是C库还没有刷新缓冲区,在这种情况下你需要调用fflush() - 但是,在启动子进程之前调用fclose(),{ {1}}内部调用fclose()

实际上,由于fflush()使用shell来启动作为参数传递的命令,因此您可以使用以下简单SSCCE来验证它是否有效:

system()

这里,#include <stdio.h> void writefile(){ FILE *fp; fp = fopen("ABC.txt","w"); fputs("Some lines...\n",fp); fclose(fp); system("cat ABC.txt"); } int main() { writefile(); return 0; } 只是调用system()命令来打印文件内容。输出是:

cat