2023年11月6日 (月曜日)

13:00:49 # Life O_CLOEXECでOpen。POSIXの挙動だと思うだけどOpenシステムコールのデフォルトの挙動で微妙なのが、ファイルディスクリプタをFork・Execした子プロセスにそのまま共有するという挙動がある。特にスレッドを使っていてFork・Execすると一体誰がForkして誰がOpenしているのかわからない、のでよくわからないファイルディスクリプタが子プロセスに渡され、なんかベストプラクティスとしていらないファイルディスクリプターを0から512番くらいまで手当たりしだいにCloseするということが行われている。なんか無駄である。 OpenにはO_CLOEXECというフラグがありそれをつかうとFork/ExecしたときにファイルディスクリプタがCloseされてくれるという挙動に変わる。デフォルトにしてほしいがまぁ互換性も考えると指定できるのは偉い。 ところでCにはOpenシステムコールとは別にバッファI/OするFopenというLibc関数がある。これがまたモードのしh亭が文字列で指定されるのでO_CLOEXECしてほしいということを伝える方法がもともとはなかった。なので多分APIのレベルではファイルディスクリプタを子プロセスに渡さないでほしいと指定する方法がそもそもなかったのではないかな。fdを取得してfcntlしてとかになったような気がする。 で、それはまずいので、"e"というのがモードに追加された。O_CLOEXECな挙動、つまりExecしたときにCloseされるようになる。 一体いつの間にこんな機能が追加されていたんだろうと思って調べたらGlibc2.9、Glibc2.9がDebianにはいったのが2009年。え、もうそんなに前だったのか。最近追加された機能だと思って紹介しようと思ったのに。

Junichi Uekawa