发送SIGINT时,unix应用程序在fread()期间挂起

时间:2012-02-17 14:53:37

标签: c++ c unix fread

我正在使用fread阅读一个大文件。当我使用Ctrl + C在程序中断程序时,程序挂起并且不可用,也不能使用kill -9。它简单易用100%CPU,保留已经分配的RAM。修复它会很棒,但是能够从外部杀死该应用程序也是可以的(主要问题是我自己无法重启该机器)。 有没有办法在Unix中这样做?

谢谢!

以下是来源:

int Read_New_Format(const char* prefix,const char* folder)
{
  char filename[500];
  long count_pos;
  //open files for reading. 
  sprintf(filename,"%s/%s.pos.mnc++",folder,prefix);
  FILE *pos = fopen(filename,"r");
  if(pos==NULL)
  {
    printf("Could not open pos file %s\n",filename);


  }

  //read the number count of entries in each of the three files.
   fread(&count_pos,sizeof(long),1,pos);


  printf("[...]");

  //read the complete file into an array.

  float *data_pos = new float[3*count_pos];



  fread(data_pos,3*sizeof(float),*count_pos,pos);

  printf("Read files.\n");
[...]
}

2 个答案:

答案 0 :(得分:1)

如果您的程序不能被信号中断,那几乎肯定意味着它处于不间断的睡眠状态。这通常是一种非常短暂的状态,只有在等待物理磁盘执行读取或写入时才会暂时存在,这可能是由于明确的readwrite调用无法通过缓存,或由于页面错误导致的缓存,其中磁盘支持的页面未交换到物理内存中。

如果不间断睡眠状态持续存在,这几乎肯定表明存储设备上的负载极高(一次发生大量IO请求),或者更可能是硬件损坏。

我怀疑您的硬盘出现故障或光盘已被刮伤。

答案 1 :(得分:0)

几天后问题无法重现。可能是文件系统的问题。作为一种解决方法,直接使用unix库例程而不是fread工作。