- - PR -
理解に苦しむ、不思議な現象?
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-11-18 21:20
こんばんわ。
ただいま、linux環境下にてプログラミングをし、あるモジュールを作成しています。 そのモジュール内のある関数内での問題です。内容は↓ コマンド'ps'を実行し、それを'ps.txt'というファイルにリダイレクト。 そのファイルから、%CPUと%MEMの欄が共に高いプロセスの各パラメータを変数に格納する。 とりあえず、上位20位ほどをいただく。 そして、問題の部分なのですが、 for (i = 0; i < 20; i++) { fgets(buf, sizeof(buf), fp); sscanf(buf, "%s %d %lf %lf %d %d %s %s %s %s %s", user, &pid, &cpu, &mem, &vsz, &rss, tty, stat, start, time, command); printf("The 'CPU':%.1lf\n", cpu); } もうちょい上の方で、ps.txtをfopen()しています。 そして、fgets()で、1行1行読み込み、sscanf()で各変数に代入しようかと、、、。 printf()は正常にとれているかチェックしているだけです。。 実際にこれを実行すると、20回ループだけのはずが、永久ループのような状態に陥り、永遠とprintf()し始めます。 、、、なぜでしょうか? ためしに、for()文を解除し、fget()・sscanf()を2回打ち込むと、正常に動作します。 何の差があるのでしょうか?(ーー;) なにか、単純な見落としがあるのでしょうか? よろしくおねがいします。 単純な事でしたら、お許しください。 |
|
投稿日時: 2008-11-18 21:52
ざっと見てですが。
%sで受けているものがバッファオーバーフローを起こして、iの領域をつぶしてるんじゃないでしょうか。 |
|
投稿日時: 2008-11-18 21:56
考えられる、原因としては、
●fgets()のエラー処理をしていない。 ●sscanf()のエラー処理をしていない。 ●変数iを何かに使いまわししていて、値が書き換わっている。 と言うところではないかな。 |
|
投稿日時: 2008-11-18 23:37
iがどんな値になっているか
>printf("The 'CPU':%.1lf\n", cpu); にiも書き出してみれば。 |
|
投稿日時: 2008-11-19 10:15
解決いたしました!☆
皆さんの言う通り、'i'に余計な数値が入ってしまっていました。 他の変数に十分な領域を確保していたつもりだったのですが、、、、 オーバーフローでした。(T_T) でも、これですっきりしました。 ご協力感謝します。 |
1