我正在使用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脚本中的文件。
答案 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