- PR -

理解に苦しむ、不思議な現象?

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2008/01/26
投稿数: 22
投稿日時: 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回打ち込むと、正常に動作します。

何の差があるのでしょうか?(ーー;)
なにか、単純な見落としがあるのでしょうか?

よろしくおねがいします。  単純な事でしたら、お許しください。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-11-18 21:52
ざっと見てですが。
%sで受けているものがバッファオーバーフローを起こして、iの領域をつぶしてるんじゃないでしょうか。
やんち
常連さん
会議室デビュー日: 2008/10/24
投稿数: 32
投稿日時: 2008-11-18 21:56
考えられる、原因としては、
●fgets()のエラー処理をしていない。
●sscanf()のエラー処理をしていない。
●変数iを何かに使いまわししていて、値が書き換わっている。

と言うところではないかな。
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2008-11-18 23:37
iがどんな値になっているか
>printf("The 'CPU':%.1lf\n", cpu);
にiも書き出してみれば。
未記入
常連さん
会議室デビュー日: 2008/01/26
投稿数: 22
投稿日時: 2008-11-19 10:15
解決いたしました!☆

皆さんの言う通り、'i'に余計な数値が入ってしまっていました。

他の変数に十分な領域を確保していたつもりだったのですが、、、、
オーバーフローでした。(T_T)

でも、これですっきりしました。
ご協力感謝します。
1

スキルアップ/キャリアアップ(JOB@IT)