while (1) { char * p = fgets(buf, 1000, fp); if (p == NULL) { sleep(1); } else { printf("%s\n", p); } }このずさんなコードはlinuxやSolarisだとちゃんと動いて,ファイルに追記されると追従することができるのだが,Mac OSでは動かない.ファイルに追記しても,ずっとfgetsがNULLを返す.
ストリームの中にはすでにEOFに当ったという情報が保持されているのだけど,これを明示的にクリアしてやらないと,いけない,ということのようだ.もっとお行儀のいいコードはこんな感じ.そもそもNULLで返ってきたときに,EOFなのかエラーなのかをferrorでちゃんと見てやって,EOFのときだけ,clearerr()でクリアしてやる.こうするとMac OS でもちゃんと動く.
while (true) { char * p = fgets(buf, 1000, fp); if (p == NULL) { if (ferror(fp)){ printf("error, abort\n"); break; } clearerr(fp); sleep(1); } else { printf("%s\n", p); } }この違いは,きっとSys V系(Linux, Solaris)とBSD系(Mac OS X)に由来する違いなんだろうなあ...
0 件のコメント:
コメントを投稿