• ベストアンサー

fopenとfcloseの繰り返しでpanic (FREEBSD)

以下のプログラムをコンパイルして実行すると panicが発生して強制リブートしてしまいました。 これは何が原因なのでしょうか? 頻繁にfopenとfcloseを繰り返したら駄目なのでしょうか・・。 #include <stdio.h> main(){ FILE *fp; while(1){ fp=fopen("test.txt","wt"); fprintf(fp,"aaaaaaaaaa\n"); fclose(fp); } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1です。 (以下、実験が自己責任であることは認識した上で、行っています。) もう一度、VirtualPC上の6.1-RELEASE-p10で1時間ほど実行してみましたが、 Panicは起こりませんでした。 すでに行っているものもあるかもしれませんが、 実験出来そうなことを何点かあげてみます。 (1)コンパイルオプションを変えてみる(-O2だったら、-O0,とか-O1とかにしてみる)。 (2)設定ファイル「GENERIC」でコンパイルしたカーネルで試す。 (3)6.1-RELEASEをインストールして、その直後に試す。 (4)「memtest86」等でメモリをチェックする。 VMWaveでもPanicしているのだとしたら(3)のメモリエラーは考えにくいですね。

situmonman
質問者

補足

ありがとうございます。 メモリエラーってことは多分ないと思います。 このプログラムを動かさない限り他のソフトはずっと正常に動い てますので・・・。 あとカーネルの再構築もGENERICを使ってます。 いろいろ起動しているデーモンを停止してから試してみたのですがやっぱり同じようにパニくってしまうみたいです。 ちなみに落ちる直前に以下のメッセージが常に出ます。 panic: kmem_malloc(4096): kmem_map too small: 62849024 total allocated Uptime: *h*m*s Cannnot dump. No dump device defined. Automatic reboot in 15 seconds - press a key on the console to abort kmem_mallocとかをキーにしてちょっとググって見たのですがやっぱりわかりませんでした。

その他の回答 (1)

回答No.1

ちょっとドキドキしながら実験してみましたが(笑)、 普通に何事もなく実行出来て、[CTRL]+Cで終了出来ました。 ちなみに環境はVirtualPC上のFreeBSD 6.1-RELEASE(-p10)です。 >uname -a FreeBSD XX-SERVER.quake 6.1-RELEASE-p10 FreeBSD 6.1-RELEASE-p10 #0: Thu Nov 2 17:06:11 JST 2006 yamakawa@XX-SERVER.quake:/usr/obj/usr/src/sys/XX-SERVER i386 >which cc /usr/bin/cc >cc hoge.c >./a.out ^C FreeBSDのバージョンは何ですか? コンパイラはFreeBSD標準のものですか? make worldでカーネル/バイナリの再構築はしていますか? 起動後、どのぐらいの時間でパニックしますか?

situmonman
質問者

補足

ご回答ありがとうございます。 実験までしてもらえるなんて感謝感激です! でも相当危ないのでもう試さないでくださいね(^^; (当方のPCでは実際ファイルが消失しましたので・・) >FreeBSDのバージョンは何ですか? 6.1RELEASE p10です。 >コンパイラはFreeBSD標準のものですか? gccを使ってます。ccとgccっていっしょですよね? >make worldでカーネル/バイナリの再構築はしていますか? しています。 >起動後、どのぐらいの時間でパニックしますか? 大体2~3分でしょうか。 VMWAREにインストールしたものと、PC上に インストールしたものとで試しましたがどちらでも PANICになりました(>_<)。 ちなみにWINDOWS+VISUALC++では起こらないようです。 まあ、こういう変なコードを書かなければすむ話なんですが・・ これだけのことで簡単にシステムが落ちるなんて思ってなかったので 気になって聞いてみました。(FREEBSDは安定なOSと聞いてましたので)

関連するQ&A

  • fopen用の関数を作りたいです。

    #include<stdio.h> void F_open(FILE *fp); main(){ FILE *fp; F_open(fp); fprintf(fp,"aaa\n"); } void F_open(FILE *fp){ fp=fopen("aa.txt","w"); } とすると、ファイルオープンはできるのですが >fprintf(fp,"aaa\n"); で書き込もうとしたときにエラーになってしまいます。 解決策を教えていただきたいです。

  • fopenの追記モードについて

    宜しくお願いします。 fopenで追記モードでファイルを追記するとき、 FILE *fp; fp = fopen("hogehoge.txt", "a"); fprintf(fp, "aaa\n"); fclose(fp); fopen("hogehoge.txt", "a"); fprintf(fp, "bbb\n"); fclose(fp); と毎回ファイルを開きなおすと、出力結果が bbb aaa となってしまうのですが、 aaa bbb と出来ない物でしょうか?

  • fopenのコード

    初歩的なことですがファイルをオープンするfopenの例題で *************************** #include<stdio.h> int main (void) {   FILE  *fp;     fp = fopen ("test1.txt","w");   if (fp==NULL) {     printf ("ファイルをオープンできませんでした。\n");     return 1;   }    else {     printf ("ファイルをオープンしました。\n");   }    fclose (fp);   printf ("ファイルをクローズしました。\n");    return  0; } *********************************というのがあります。 この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? (例題によっては-1というのもありましたが・・。) またどこに戻り値を返すのでしょうか? もしファイルがオープンできなければその時点で終了になるのでしょうか?初歩的なところですがお願いします。

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • C言語のファイル入出力について

    for文の中でファイルの入出力をファイル名を変えながら行うことはできますか?作成したいプログラムは以下の通りになっています。 よろしくお願いします。 #include<stdio.h> main() { int i; FILE *fp; for(i=0;i<10;i++) {  fp=fopen("ココにiの値を入れたい.txt","w");  fprintf(fp,"%d\n",i);  fclose(fp); } return(0); }

  • Cプログラミングの質問なのですが,

    Cプログラミングの質問なのですが, 以下のプログラムで正規乱数を発生させたいのですが,どこがおかしいのでしょうか? fp1のransuuはきちんとtxtで作成されています。 至急お助けください。 #include <stdio.h> #include<stdlib.h> #include<math.h> #define PI 3.141592653589793238 int main (void) { FILE *fp1,*fp2; int i,n; unsigned int x1,x2; double y1,y2; fp1=fopen("ransu.txt","r"); fp2=fopen("seikiransu.txt","w"); for(i=0;i<n;i++) { fscanf(fp1,"%lf",&x1); fscanf(fp1,"%lf",&x2); y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); fprintf(fp2,"%lf\n",y1); } fclose(fp1); fclose(fp2); return 0; }

  • fprintfで出力するファイルのパス指定について

    cで以下のコードを書いています。 file.txtを任意の場所に作りたいのですが どうすればいいのでしょうか。 fopen("c:\file.txt", "r"))と書くとエラーになって しまいました。 void main(void) { FILE *fp; if ((fp = fopen("file.txt", "r")) == NULL) { fprintf ( stderr, "err\n" ); exit (2); } fprintf(fp,"%s\n",a);; fclose(fp); }

  • デスクトップにfopen()したい(C言語)

    #include <stdio.h> int main(){    FILE *fp;    fp = fopen("デスクトップのパス\\ファイル名","w");    fclose(fp);    return 0; } のようにして、デスクトップ上にファイルを作成したいと思ってます。 どうすればデスクトップのパスが取得できますか?教えてください!

  • コマンドラインによるファイル名指定

    #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp,*fpc; int i=0; char line[1000]; fp = fopen("test.txt","r"); if(fp == NULL) { printf("File not found.\n"); exit(1);  }  fpc = fopen(argv[1],"w"); if(fpc==NULL){ fprintf(stdout,"Can not open file.\n"); exit(1); } while(fgets(line[i],1000,fp)!=NULL){ i++; } for(i=3;i<0;i--){ fprintf(fpc,"%s",line[i]); } fclose(fp); fclose(fpc); return 0; } コマンドラインでファイル名を指定し、そのファイルに、test.txt(4行の文字列)の内容を各行を逆順に書き出すプログラムですが、上手くいきません。ご指摘を願いします。

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }