14

popen()実行する関数がありtail -f sometextfileます。ファイルストリームにデータがある限り、明らかにデータを取得できますfgets()。これで、新しいデータが末尾から来ない場合、fgets()ハングします。私は試しferror()てみfeof()ましたが、役に立ちませんでした。fgets()ファイル ストリームに新しいものが何もないときに がデータを読み取らないようにするにはどうすればよいですか?

提案の1つはでしたselect()。これはWindowsプラットフォーム用であるため、匿名パイプが機能しないように見えるため、selectは機能しないようです(この投稿を参照)。

4

5 に答える 5

29

Linux (または任意の Unix-y OS) では、 popen() によって使用される基になるファイル記述子をノンブロッキングとしてマークできます。

#include <fcntl.h>

FILE *proc = popen("tail -f /tmp/test.txt", "r");
int fd = fileno(proc);

int flags;
flags = fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);

利用可能な入力がない場合、fgets は errno を EWOULDBLOCK に設定して NULL を返します。

于 2008-09-29T18:19:29.127 に答える
15

fgets()はブロッキング読み取りであり、データがない場合はデータが利用可能になるまで待機することになっています。

select()、、、poll()またはを使用して非同期I/Oを実行する必要がありますepoll()。そして、利用可能なデータがあるときにファイル記述子からの読み取りを実行します。

FILE*これらの関数は、ハンドルのファイル記述子を使用します。int fd = fileno(f);

于 2008-09-29T17:57:34.467 に答える
1

スレッド、特に を使用して問題を解決しまし_beginthread_beginthreadex

于 2008-10-01T14:44:14.930 に答える
0

Cライブラリの関数の代わりにIOにPOSIX関数を使用する場合は、selectまたはpollを使用できます。

于 2008-09-29T17:55:13.287 に答える
0

代わりに、tail自体と同様に、低レベルのIO関数(open()、read()など)を使用してテキストファイルを読み取ってみることができます。読み取るものがなくなると、read()はゼロを返しますが、FILE *関数とは異なり、次回はさらに読み取ろうとします。

于 2008-09-29T17:55:49.650 に答える