приложение unix зависает во время fread () при отправке SIGINT - PullRequest
0 голосов
/ 17 февраля 2012

Я читаю большой файл, используя fread. Когда я прерываю программу во время ее использования с помощью Ctrl + C, программа зависает и не подлежит уничтожению, также не с помощью kill -9. Он просто придерживается 100% CPU, сохраняя оперативную память, которую он уже выделил. Было бы замечательно исправить это, но было бы хорошо просто убить это приложение извне (главная проблема в том, что я не могу перезагрузить эту машину самостоятельно). Есть ли способ сделать это в 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 ]

1 голос
/ 17 февраля 2012

Если ваша программа не может быть прервана сигналом, это почти наверняка означает, что она находится в режиме непрерывного сна.Обычно это крайне недолговечное состояние, которое существует только на мгновение, пока физический диск не выполняет чтение или запись, либо из-за явного вызова read или write, который не может быть удовлетворен кэшем, либоодна из них - из-за сбоя страницы, когда страница на диске не помещается в физическую память.

Если состояние непрерывного сна сохраняется, это почти наверняка свидетельствует о чрезмерно высокой нагрузке на устройство хранения (огромное количествозапросов ввода-вывода (все запросы происходят одновременно) или, что более вероятно, поврежденное оборудование.

Я подозреваю, что у вас неисправный жесткий диск или поцарапанный оптический диск.

0 голосов
/ 21 февраля 2012

Проблема не воспроизводилась через несколько дней.Возможно проблема с файловой системой.В качестве обходного пути сработало прямое использование процедур библиотеки unix вместо fread.

...