通过探测,C程序从缓冲区写入文件

时间:2015-01-15 12:17:58

标签: c file io buffer flush

我正在使用以下代码将模拟输出写入文件

sprintf(filename, "time_data.dat");
FILE *fp = fopen(filename,"w");
for(i=0;i<ntime;i++){
    compute_data();
    fprintf(fp, "%d %lf %lf \n", step, time_val ,rho_rms);
}
return;

在我的桌面上,我每隔几个小时就会看到文件time_data.dat更新(compute_data()每个时间步数需要几百秒,在i7机器上使用OpenMP)。我现在已将作业提交到群集节点(运行ubuntu服务器的E5 2650处理器)。我现在已经等了5天了,文件中还没有出现换行符。我做了

  

tail -f time_data.dat

检查输出。模拟将需要几周时间才能完成。我不能等那么久才能看出我的输出是否良好。有没有办法可以探测节点中的操作系统来刷新缓冲区而不会干扰计算?如果我现在取消工作,我相信不会有任何输出。 请注意,正在写入输出文件的硬盘是使用多个节点上的NFS和主节点共享的硬盘。这会造成什么麻烦吗?输出实际上是否有临时文件位?

PS:我做了du -h找到显示大小为0的文件。我也试过ls -l proc / $ ID / fd来确认文件是否打开。

1 个答案:

答案 0 :(得分:1)

您可以使用lsof或仅ls -l /proc/$(pidof yoursimulation)/fd来检查(在群集节点上)确实已打开time_data.dat

对于这些长期运行的程序,我认为值得考虑使用:

  • application checkpointing技术
  • persistency您的应用数据,例如在一些数据库中
  • 设计一些查询应用程序状态的方法(例如使用某些HTTP服务器库,例如libonion,或者至少有一些JSONRPC或其他服务来查询有关状态的信息)