• 締切済み

fopen/fcloseでメモリリーク?

Linux2.4系です。 Cプログラムでログファイルをフラッシュドライブ上のファイルに書き足していく処理があり、 デバッグテストで処理を高速に繰り返しながらコマンドラインのfreeコマンドでメモリ残量を 確認すると、かなり速いペースでキャッシュが減ります。 原因と対処法をご存じの方、おられないでしょうか? 処理は概ね以下のような感じです。 FILE *log_file; log_file = fopen( "../log/0001.txt" , "a+" ); fwrite( &text1, 1, sizeof(text1), log_file ); fclose( log_file ); 頻度は毎秒3回くらいで書き足すテキストは1kバイト程度です。 fwrite()を止めてもメモリ減少は止まらないですが、fopenとfclose を止めると減少しなくなります。

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

キャッシュが減ってバッファーが増えているなら正常です。 そもそもキャッシュが減ることでメモリリークを心配するのが間違いで、何の関係もありません。 cat /proc/プロセス番号/status をしてみて、VmSize というのがそのプロセスが使っている論理メモリサイズです。プロセスは定常状態のはずなのに、これがどんどん増え続けるならメモリリークです。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

そのまま動かし続けたらどうなりますか? 空きメモリはあっても役に立たないので、本当にメモリが足りなくなるまでメモリ回収処理をしないということもありえます。メモリ不足が起きないのなら気にすることはないでしょう。 メモリ不足というのは、メモリ残量が少なく表示されることではなく、メモリを使うプログラムが動いたときにそのプログラムがメモリ確保に失敗することだと考えてください。

関連するQ&A

  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

  • fopenでディレクトリ内の全ファイルを順次開く方法

     UNIX上の/home/info/user/log内にある*.logファイルを一つずつfopenで開いて一行ずつ読み込み、用が済んだらfcloseで閉じていくようなプログラムを作りたいのですが、どうすれば良いのでしょうか?  最初はls -l /home/info/user/log/*.logをリダイレクトしたファイルリストを作り、それを読み込ませてfopen……という流れを考えていたのですが、対象となるファイルが万単位に登る為実現不可でした。  一行ずつ読み込ませる部分は既に出来ているので、fopen/fcloseに絞ってお教え下さい。

  • fcloseで発生するエラーについて。

    昨日「windowsプログラムのデバッグ」で投稿させて頂いた者です。 要点は「どのようなときにfcloseがエラーをおこすか」です。 Windowsプログラムでバグを探したところデバッグ用のログ出力ファイルを fcloseする時にエラーがおこりプログラムがエラーを起こして終了している ことがわかりました。 プログラムを実行させて一定操作を行うと、プログラムの最後に行われるfcloseでエラーが起こります。 プログラムを実行させてそのまま(×等で)終了させたときにはエラーが起こらずに正常な書き込みがされているので、 メッセージの処理等をしている間に変な処理を入れてしまているのだと思いますが、 実際にログファイルへの書き込みはfcloseの直前までできているのでなぜエラーが起こるのかよくわかりません。 if((fp=fopen("log.txt","w")==NULL)return -1; とやっているのでfopenは成功していると思います。 fcloseがエラーとなるのはどのような原因が考えられるのでしょうか。 「意味がわからないので~を説明しろ」等でも構いませんのでご回答お願いいたします。 【環境】 VC6.0++ProffessionalEdition windows2000 【その他】 -エラー文の内容- "0x77fcc465"の命令が"0xfffdfffa"のメモリを参照しました。 メモリが"read"になることはできませんでした。

  • Cでバイナリデータを変換

    今持っているバイナリファイルfile1.x86をテキストファイルfile1.txtに変換したいんですけどうまくいきません。fopenとfreadでバイナリファイルを読み込むところまで入っていると思うんですけど、テキストファイルとして書き出すことができません。 #include <stdio.h> main() { short a[32000]; FILE *infile, *outfile; infile = fopen("iroha.x86", "r"); outfile = fopen("iroha.dat", "w+"); fread( a, sizeof(short), 32000, infile ); fwrite( a, sizeof(short), 32000, outfile ); fclose(infile); fclose(outfile); } これだとそのまんま出力されるんです。当たり前なんですけど... どこをどう変えればいいか教えてください。 よろしくお願いします。

  • ファイルに書き込むためのPHPを教えてください

    いつもお世話になります。PHPの初心者です。 フォームの一部($text)からデータを受け取って、ファイル(log.cgi)に書き込むPHPを作りましたが、うまく作動しません。 どなたかお分かりになるかた教えてください。 //保存用ログファイル define('DE_LOGFILE', 'log.cgi'); $logtext = @file(DE_LOGFILE); //ログに書き込む $handletext = @fopen(DE_LOGFILE, "w") or _error_page(DE_LOGFILE.'に書き込めません'); fwrite($handletext, $text); @fclose($handletext);

    • ベストアンサー
    • PHP
  • HTKのヘッダについて

    HTKというツールキッドを使用しています。 HTKでは任意のデータを使ってHMMの学習ができるのですが、そのときにデータファイルに12バイトのヘッダを付加する必要があります。 この処理をc言語のプログラムでやろうとしているのですが、うまくいきません。 ヘッダは、long型long型short int型short int型という4つの情報で構成されていて、そのあとにfloat型のデータが続いています。 使用しているプログラムの一部は以下のようになっています。 out = fopen("outfile", "wb"); fwrite(&head1,sizeof(long),1,out); fwrite(&head2,sizeof(long),1,out); fwrite(&head3,sizeof(short),1,out); fwrite(&head4,sizeof(short),1,out); fwrite(data, sizeof(float), num, out); //data[]がデータ fclose(out); このプログラムで書き出したファイルでHTKのHInitを実行すると「ヘッダが読み込めない」というエラーがでてしまいます。 任意のデータをHTKフォーマットにするにはどうすればいいのでしょうか?教えてください。よろしくお願いします。

  • fread処理がうまくいかない!!

    バイナリエディタでfwriteで書き込んだデータは確認できたのですがfread後のデータがきちんと表示されません。 どうしてでしょうか? #include <stdio.h> void main(void) { char i[] = {'a','b'}; char j[2]; FILE *fpbin; fpbin = fopen("data","wb+"); fwrite(&i,sizeof(char),2,fpbin); fpbin = fopen("data","rb"); fread(&j,sizeof(char),2,fpbin); printf("j = %c\n", j[0]); fclose(fpbin); }

  • メモリリークについて

    VC6.0でデバッグ実行すると Detected memory leaks! Dumping objects -> ソースファイル名(932) : {136739} normal block at 0x00FD4AC0, 0 bytes long. Data: <> メッセージがあり メモリがリークしているようです メッセージやソースから察するに 0バイトの領域を確保し それを解放したときに起こっているようです 領域をmallocして 解放ではNULLでなければ解放 という処理はしてはいけないことなのでしょうか 0バイトの領域を確保した場合 又は0バイトの領域を確保しないように 処理しないといけないのでしょうか? 知識のある方よろしくお願い致します

  • BITMAPFILEHEADER bfSize

    DIBからBMPファイルを作成する処理の一部です。 int nImageSize = pDIB->biSizeImage + (sizeof(RGBQUAD)*dwPaletteSize)+sizeof(BITMAPINFOHEADER); BITMAPFILEHEADER bmpFIH = {0}; bmpFIH.bfType = ( (WORD) ('M' << 8) | 'B'); bmpFIH.bfSize = nImageSize + sizeof(BITMAPFILEHEADER); bmpFIH.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*dwPaletteSize); fwrite(&bmpFIH, 1, sizeof(BITMAPFILEHEADER), pFile); fwrite(pDIB, 1, nImageSize, pFile); fclose(pFile); pFile = 0; BMPファイルは作成されますが、メモリリークします。 bmpFIH.bfSize を 0 またはそれに近い小さな数字にすると、メモリリークは検出されません。 bmpFIH.bfSize はファイルサイズのようですが、これが入っていないと問題でしょうか? また入れるとすればどのような数字を入れるべきでしょうか?(メモリリークの原因も含めて) 宜しくお願いします。 開発環境:VC++ 2008 MFC

  • fopenとfile_put_contents

    ファイルを操作する関数「fopen」と「file_put_contents」を勉強していて 不思議に思いました。 「fopen」を使ったファイルに書き出す場合 「fopen」→「flock(LOCK_EX)」→「fputs」→「flock(ロック解除)」→「fclose」の 流れが必須になるようですが 「file_put_contents(FILE_APPEND | LOCK_EX)」の場合、 この関数一つで同じような処理されるようですが ロックやロックの解除、書き込んだファイルを閉じるなどの 役割がすべて補われるのでしょうか? 「file_get_contents」も同じだような役割りのようで 手間をかけて複雑になってしまう「fopen」を使う理由は あるのでしょうか? 処理工程など多少の違いの説明は読んでみたのですが 複雑になる「fopen」を使う必要性が分かりません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP