2012-02-17 8 views
0

freadを使用して大きなファイルを読み込んでいます。私がCtrl + Cを使ってプログラムを中断すると、プログラムはハングアップし、kill -9ではなくkillableではありません。 100%のCPUを使って簡単にスティックし、すでに割り当てられていたRAMを維持します。それを解決することは素晴らしいことですが、外部からそのアプリケーションを強制終了できることも大丈夫です(主な問題は、自分でそのマシンを再起動できないという事実です)。 Unixでこれを行う方法はありますか?SIGINTを送信するときに、fread()の間に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"); 
[...] 
} 
+0

あなたは本当に* UNIX *やOSのようないくつかのUNIXについて話していますか?ほとんどのUNIXのようなOSでは、-9を指定しても、特定のシステムコールで打たれたプロセスを強制終了することはできません。 – PlasmaHH

+0

申し訳ありません、それはSUSEです... – rugermini

+0

あなたはソースコードを投稿できますか?通常、シグナルはシステムコールを中断します。 –

答えて

0

数日後に問題が再現できませんでした。ファイルシステムに問題がある可能性があります。回避策として、freadの代わりにunixライブラリルーチンを直接使用しました。

1

あなたのプログラムがそのほとんど確実に、シグナルによって中断することができない場合は、無停電スリープ状態であることを意味します。これは通常、物理ディスクが読み取りまたは書き込みを実行するのを待っている間に一時的に存在する極短期間の状態です。明示的なreadまたはwriteコールがキャッシュで満たすことができないか、またはディスクバックアップされたページが物理メモリにスワップされないページフォルト

中断されないスリープ状態が続く場合、これはストレージデバイスの非常に高い負荷(一度に多数のIO要求が発生していること)またはハードウェアの損傷の可能性があることを示しています。

ハードディスクに問題があると思われます。

+0

ありがとうございました!私はそれがハードウェアまたはI/O負荷であるとは思わないが、この問題の横にあるシステムはうまく動作しており、この問題が発生していない非常に多くの人々によって使用されている。また、(これは誤解を招くかもしれない)トップは、プロセスが実行中であり、スリープしていない(S)または中断していないスリープ(D)していることを伝えます。上記のように、freadの代わりにreadを使用すると問題は発生しません。私はそれが私のコンパイラとそのマシン上でやり直して、ここに再び投稿しなければならないかどうか試してみるでしょう。 – rugermini

+0

シグナルハンドラをインストールしたか、シグナルマスクを修正しましたか? –

+0

いいえ、私はそれをしませんでした。 – rugermini

関連する問題