
やりたいことは、tail -fのようにファイルに追加があれば、検知して読み出したいのですが、条件として、selectを使う必要があります。
具体的に下記処理をしています。
1.ファイルを読み込み専用でopen
2.1のディスクリプタをreadfdsに設定してselectで数秒待ち
3.2でreadfdsにディスクリプタがセットされていたらすべて読込
しかし、ファイルに追記されていないにも関わらず
2の待ちが終わり、3で0バイトの情報を読む形になります。
ディスクリプタに標準入力の0を指定するとうまく待ちとなります。
ネットで検索をしたのですが、あまりそのような処理は載っておらず
tailのソースでもselectは利用していないため、困っております。
どのようにすれば、よいのでしょう。
ソースは、まだ独自ライブラリを利用している部分があるため
一般公開できるレベルに落とし込んでおりません。申し訳ないです。
専門の方ならおそらく処理を見て、理解できると思い、記載は不要と判断しました。

No.1ベストアンサー
- 回答日時:
私もlinux(centos6.3)で確認しましたが、同様の現象でした。
マニュアルを参照すると、(以下抜粋)
---------------------------------
select() や pselect() を使うと、プログラムで複数のファイルディスクリプターを監視し、 一つ以上のファイルディスクリプターがある種の I/O 操作の 「ready (準備ができた)」状態 (例えば、読み込み可能になった状態) になるまで待つことができる。 ファイルディスクリプターが ready (準備ができた) とは、 (read(2) などの) 対応する I/O 操作が停止 (block) なしに実行したり、 十分小さな write(2) を実行したりできる状態にあることを意味する。
-------------------------------------
これは、読込に関して言えば、ブロックされないで読み込める状態なら、select完了というように読み取れます。標準入力からの読込については、たしかに、データが無いときはブロックされるので、
selectで待つ意味がありますが、ファイルの読込については、ブロックされないので、selectで待っても、即座にselectが完了してしまいます。(たぶんこれがselectの仕様かと思いますが)
ですので、対策としては、「一定時間(10ミリ秒~1秒程度)スリープして、ファイルを読み込み、データがあれば表示する」というのを繰り返すというのが、現実的な方法かと思います。
tail -f相当の機能ということであれば、それで十分かと思います。
以下、参考URLです。
http://linuxjm.sourceforge.jp/html/LDP_man-pages …
ご回答有難う御座います。
自分も同様の仕様認識です。
しかし、selectのような関数が、まさかこんなこともできないのか?
という疑問もありまして、方法があればと思い、相談した次第です。
最終手段としてポーリングは検討していますが、できればイベントドリブンにするのが
美しいと考えています。
No.2
- 回答日時:
使ったことはないので本当にできるかはわかりませんが、
inotifyのIN_MODIFYイベントをキャッチすればリアルタイムな変更にも対応できそうです。
といいつつ、こういったイベントキャッチ系のシステムコールといえども、
その裏側は定期的な割り込みのタイミングでしか見ていないので、
程度の差こそあれ、#1の方のご回答のような自前コードでも本質的には変わらないような気がします。
つまり、リアルタイムな変更に対応したような気分に浸るか、
なんちゃってだけど体感的にはリアルタイムに対応するプログラムを自作したという満足感に浸るか、程度の違いでしょう。
ちなみに、0は、多分パイプだから、selectでキャッチできるのでしょう。
fork→execするとき、forkの前にpipe作るでしょ、その原理だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- 弁護士・行政書士・司法書士・社会保険労務士 翻訳された契約書の難解な日本語 2 2023/08/09 23:41
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- C言語・C++・C# pythonで外部のファイルを読み込む際のエラー 2 2022/04/12 19:22
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OCXの作成
-
A4の紙に印刷されている文字を...
-
eclipseでタブ入力ができなくな...
-
複数のブックを新しいブックのS...
-
PC内で速度を遅くした音源をCD...
-
数値の細かい端数について
-
C++の画像処理について【画像の...
-
外部画像を読み込んでページを...
-
e-taxで送信ファイルの拡張子が...
-
スマホでtxtファイルを編集する...
-
個別に違う添付ファイルを付け...
-
ファイル数と合計サイズの取得方法
-
iPhoneの内蔵の記憶媒体は、HDD...
-
読み込まれた画像のサイズについて
-
エクセルのセルからフォーカス...
-
stdio.hの中身
-
TrueTypeフォントのファイル構...
-
動画のURLの見方
-
指定したフォルダーを開いてフ...
-
カメラのフラッシュは大丈夫?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
個別に違う添付ファイルを付け...
-
e-taxで送信ファイルの拡張子が...
-
エクセルで「特定の文字を含む...
-
複数のブックを新しいブックのS...
-
拡張子「.IDJ」を、windo...
-
A4の紙に印刷されている文字を...
-
PC内で速度を遅くした音源をCD...
-
2枚、マイクロSDカードを入...
-
GIMP separate+プラグイン クラ...
-
リストビューの選択状態を取得...
-
Accessのソースが見れない
-
eclipseでタブ入力ができなくな...
-
スマホでtxtファイルを編集する...
-
TextBoxにフォーカスを与えると...
-
ファイル数と合計サイズの取得方法
-
リストビューで選択行の背景を...
-
iPhoneの内蔵の記憶媒体は、HDD...
-
garagebandのLR Mixの方法について
-
クラリスインパクトに替わるソ...
-
エアコンの冷媒 R410Aの重...
おすすめ情報