• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fgetsについて)

fgetsについて

このQ&Aのポイント
  • C++を用いて、Fedora上で1秒ごとのeth0(NIC)を通過したackパケットを記録するプログラムを作成中。
  • fgets関数についての質問。通信が行われていない状況で実行するとプログラムが止まってしまい、正確な時間計測ができない。
  • 代わりになる関数や方法を探している。C++初心者で、読みやすいプログラムではないと感じている。

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>これがおそらく原因かと思いますが、何も通信が行われていない状況で実行すると、 >temp = fgets(buf,150,pp); >の行でプログラムが止まってしまいます。(何かしら通信がある(パケットが通る)と再開します) tcpdumpが何か出力するのを待ってる状態なので止まってるように見えるのは当然です。 例えば #include <stdio.h> int main() { char buf[128]; if (fgets(buf, sizeof(buf), stdin) != NULL) { printf("%s\n", buf); } return 0; } をコンパイルし実行するとどうなるかわかります? popenとfgetsでやろうとするならsetbufでバッファリングをオフにしてselectを使って入力があるかどうかを調べるか、fcntlでノンブロッキングモードにしておくかじゃないかな

tomotomo2309jp
質問者

お礼

ご回答、ありがとうございます。 例に挙げられているソースをコンパイル、実行するとstdinがあるまで待ち、入ればそれを表示する動作のようです。 この例から、fgetsがtcpdumpが何か出力するのを待つ、という状況が把握できました。 fcntlを用いてノンブロッキングすることで問題は解決しました!

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

横道に完全にそれた感じもしつつ……。 http://www.nxmnpg.com/ja/3/fgets > 読込みは、改行文字が見つかったり、ファイルの終了 あるいはエラーが見つかったりした場合に停止します。 の文の構造は, 「読込みは」(条件)「停止する」 ですね。つまり,停止するのは「読込み」です。 英語版では, http://www.nxmnpg.com/3/fgets > Reading stops when a newline character is found, at end-of-file or error. と,Readingとstopsが並んでいて分かり易いのですが。

tomotomo2309jp
質問者

お礼

ご回答ありがとうございます。 文構造がうまく読めていなかったですね。。。 今回の件でfgetsの動作について少し理解できました! ありがとうございました。

すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

#2へ 困ったことに http://www.nxmnpg.com/ja/3/fgets には本当に「停止する」と書いてあります・・

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「fgtes関数は失敗した際は、NULLを返し「停止」するとあります」というのが何をどう読んだ結果の理解なのかさっぱりわからん.... 「停止」ってなんだ. wait系でがんばるのかなぁ. それでも本当に「1秒ごと」とはならないかもしれんけど.

tomotomo2309jp
質問者

お礼

ご回答ありがとうございます。 fgets関数の動作については質問文のURLの文からです。 No.5様ご指摘のように、停止するのは"読み込み"のようでした。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

>   while(1) このループを抜ける条件は何ですか?ずっと回りっぱなしのように見えます。 >調べてみると、fgtes関数は失敗した際は、NULLを返し「停止」するとあります。 ということでしたら、 >         temp = fgets(buf,150,pp); //tcpdumpから1行(1パケット分)をbufへ取得 tempがNULLかどうかを判定する必要はありませんか? >         if(src != NULL && strcmp(buf,cmp) !=0) このif文を初めて通るときのcmpの値はどうなっていると思いますか? >      j += 1; 変数 j の定義が見当たりません。i が正しいですか?

tomotomo2309jp
質問者

補足

ご指摘・ご回答ありがとうございます。 whileの条件と、j += 1について訂正したものを、while文の中身のみ、再掲いたします。 fgetsが停止するというのは、仮にfgetsの結果がNULLだと、そこでプログラムの実行が止まってしまい、 NULLではなくなるまで、つまりパケットが流れ、tcpdumpから何か出力されるまで先に行かなくなるのです。 そうなると、下にあるend=time(NULL)を読み込まず、1秒を測れなくなってしまう状況です。 ちなみに、常に何かしらの通信を行わせている状態(fgetsがNULLとならない)では、問題なく1秒をカウントできます。 while(i<150) {    start = time(NULL);    end = time(NULL);    while((int)(end - start) <1) //1秒間計測    {       temp = fgets(buf,150,pp); //tcpdumpから1行(1パケット分)をbufへ取得       src = strstr(buf,srcstr);//bufから、"ack"を検索       if(src != NULL && strcmp(buf,cmp) !=0) //検索結果がNULLでなく、前回から変更がある場合       {          num_ack[i] += 1;          strcpy(cmp,buf);       }       end = time(NULL);    }    i += 1; }

すると、全ての回答が全文表示されます。

関連するQ&A