2006年11月21日(Tue) 山頂見えるよー [長年日記]
● [run] 76+行き止まり+最短周回逆走+CSO 7.56マイル 1時間02分46秒 8.3分/マイル
昨日は走れなくて今日は暖気15分ほど。最初横っ腹が痛くて次に呼吸器系が不調。復調するのにはやはり40分ほど走らないといけない。
左親指の血豆が大きくなってきた気がする。靴に何か細工したほうがいいのかな。
● 今日の仕事メールの残数537。昨日より20通増えました。やっぱり気のせいじゃなかったか…
● LOCK_UNするのはいつ?
ストリームをflock(fd, LOCK_EX)してデータを書き込んだあと、fclose(fd)、いや正確にはfflush(fd)する前にflock(fd, LOCK_UN)してはいけないだろうと思う。バッファにデータが残ってるうちに他のプロセスがストリームを読もうとするかもしれないし、他のプロセスがロックを取ってからバッファに残っていたデータが書き出されちゃうかもしれない、と思う。でも。このことをあらわに説明してある文書はみつけられないし、試しにプログラムを作ってみても期待通りにロックできているように見えちゃう。そんなもんなのかな…
● ストリームのバッファの大きさを得る
この過程で、glibcではストリームのバッファの大きさを__fbufsize(fd)で得られることに気づいた。manページは stdio_ext(3)。
flockはシステムコールで、fcloseはstdioの一部なので、混ぜたら危険です。stdioを使うなら、flockfileを使います。funlockfileは勝手にfflushするはずなので、明示的に同期を取る必要はなかったと思います。システムコールしか使わなければユーザレベルでのバッファリングは(自分で作らなければ)ないので、いずれにしてもフラッシュする必要はありません。やらないといけなくなるのは混ぜる場合だけではないでしょうか。
最近のツッコまれどころ