• ベストアンサー

1分おきにファイルに保存したい

Vine Linux 3.1のgccを使用しています。 早速ですが質問です。 シリアルポートへ不定期(数秒~数分間隔 バイナリデータ)に入ってくるデータを そのつど解析し分類別にカウント。 その結果を1分おきに ファイルへ保存したいと思っています。 シリアルポート周りやデータ処理周りは何とか 作れたのですが1分おきに・・・のところで つまずいています。 alarm(60);でシグナルを発生させ、 sigaction(SIGALRM・・・を使用し シグナルを補足、シグナルハンドラを処理後 select()(←シリアルポートのread()を待っている) のところで Interrupted system call が発生してしまいます。 CPU負荷をかけたくないので無限ループで時間を 毎回チェック・・・等は可能な限り避けたいと 思っています。 上記方法に限らず、何か良い方法とかありましたら 是非、ご教授ください。 どうぞよろしくお願いいたします。

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

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

ブロッキングモードでselectしてますか? あと、sleep()じゃなくてわざわざalrm()を使うのは何故でしょうか? あと、複数のシリアルポートをポーリングするんじゃなければ、select()使わずに、ブロッキングモードでオープンしてread()だけですむ気がするんですけど。

qc024
質問者

お礼

補足するに書きたかったのですが、クリックできない ので、お礼を投稿するに書かせていただきました・・・ >ブロッキングモードでselectしてますか? ソースを見てみましたが、いまいち理解できません できたらもう少し詳しくご説明願えないでしょうか? read()は不要なループを避けるため、ブロッキング モードになっています。 これがいけないのでしょうか? ちなみにsigaction()関連は以下のとおりです alarm(60); struct sigaction act; act.sa_handler = warikomi; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGALRM, &act, 0); どうぞよろしくお願いいたします

qc024
質問者

補足

ご回答ありがとうございます >ブロッキングモードでselectしてますか? ソースを確認してみます >あと、sleep()じゃなくてわざわざalrm()を使うのは何故でしょうか? 受信するデータが連続して大量に来ることがあるのでalrm()を使用しています。 sleep()を使用するとバッファ(4096byte)からあふれて取りこぼしが発生してしまいました。 >select()使わずに、ブロッキングモードでオープンしてread()だけですむ気がするんですけど。 勉強不足です。早速調べてみます。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

以下の方法ではどうでしょうか。 1.selectの呼び出しをタイムアウト時間指定(例えば1秒)で行う。 2.selectのタイムアウトの時、1に戻るが、前回に書いた時間から1分経過していれば、ファイルへ書き込む。 3.データ受信完了後、1に戻るが、前回に書いた時間から1分経過していれば、ファイルへ書き込む。 上記を繰り返します。少なくとも、selectの中でsleepするのでCPUは、消費しません。

qc024
質問者

お礼

ご回答ありがとうございます。 ループの回数を可能な限り減らそうと思い、 現時点ではread()をブロックモードにしています。 うまく解決できないようであれば、この方法でやりたいと思います。

  • neo_ap1
  • ベストアンサー率26% (105/395)
回答No.3

あ、すみません。 シリアルポート監視は不定期ですね・・・。 見落としておりました。 cronでやるなら仰るとおり別々ですかね。 カウントはメモリ上に展開するか、 一時ファイルに出力するか・・・でしょうか。 う~ん、いまいちですね。 お役に立てず、失礼いたしました・・・。

qc024
質問者

お礼

>お役に立てず、失礼いたしました・・・。 いえいえ、そんなことありません。 今回に限らず、cronでの発想は私にはありませんでした。 今後機会があったら是非使ってみたいと思います。 ありがとうございました。

  • neo_ap1
  • ベストアンサー率26% (105/395)
回答No.1

ループしない単発のプログラムを作成し、 cronデーモンで指定分毎に起動すると言うのはどうでしょうか?

qc024
質問者

補足

ご回答ありがとうございます。 >cronデーモンで指定分毎に起動すると言うのはどうでしょうか? シリアルポート関連を専門に行うプログラムと、 cronデーモンで起動するファイル保存専用 プログラムに分けて・・・と言う解釈でよろしい でしょうか? この場合、カウントしているデータを取得するには どのような方法があるのでしょうか? もしよろしければ、ご教授ください。 よろしくお願いいたします。

関連するQ&A

専門家に質問してみよう