ruby-trunk-changes r33552 - r33572

今日は昨日に引き続き file descriptor に close-on-exec フラグを付加するための API 追加がたくさんありました。

akr:r33552 2011-10-29 16:12:09 +0900

ext/sdbm/_sdbm.c でも open の flags に O_CLOEXEC をセットしているところを O_CLOEXEC が定義されている時だけ実行するようにしています。

akr:r33553 2011-10-29 20:02:32 +0900

rb_cloexec_dup() という dup(2) で file descriptor を複製してすぐに close-on-exec フラグをセットする公開関数を定義して、dup() のかわりにこれを利用するようにしています。

akr:r33554 2011-10-29 20:58:30 +0900

rb_cloexec_open() の O_CLOEXEC フラグを立ててるところに O_CLOEXEC が Linux 2.6.23 から有効で、2.6.18 では単に無視されるという注意事項をコメントとして追記しています。

akr:r33555 2011-10-29 20:59:46 +0900

rb_cloexec_dup() で F_DUPFD_CLOEXEC という fcntl(2) の operation が定義されていたら fcntl(2) を実行してみるようにしています。この F_DUPFP_CLOEXEC という操作は Linux で最近追加されたもののようですね。どうやら dup(2) で複製した file descriptor の O_CLOEXEC フラグを Kernel がすぐに立ててくれるようにするもののようです。 2.6.24 から実行可能で、2.6.18 では定義はあるけど実行するとエラーになるらしく、一度エラーになったらもう実行しないように分岐が書かれています。

arton:r33556 2011-10-29 21:08:47 +0900

Windows 環境で VC2010 からは stdint.h というヘッダが存在するので、そこで定義されているものはそちらに任せるように win32/Makefile.sub で自動生成するヘッダファイルの宣言を整理しています。 [ruby-core:39150] [Bug #5243]

akr:r33557 2011-10-29 22:11:01 +0900

dup(2) に続き dup2(2) のラッパで CLOEXEC を付与する公開API rb_cloexec_dup2() を追加して、dup2(2) のかわりにこれを利用するようにしています。
ちょっと思ったんですけど、rb_update_max_fd() でプロセスの最大のファイルディスクリプタをカウントする処理も rb_cloexec_(open|dup|dup2) に入れてしまってはいけないんでしょうか。

ktsj:r33558 2011-10-29 23:56:13 +0900

ChangeLog の空行の空白の削除。

akr:r33561 2011-10-30 07:48:41 +0900

configure でシステムコール dup3(2) の存在をチェックして、存在していたら rb_cloexec_dup2() で dup2(2) のかわりに利用するようにしています。 dup3() も Linux で最近追加されたシステムコールみたいで、始めて知りました。 dup2() との違いは「呼び出し元が、新しいファイル ディスクリプタに対して close-on-exec フラグを強制的に設定することができる。これを行うには、flags に O_CLOEXEC を指定する」だそうです。これも 2.6.27 からでないと利用できないので、定義があっても呼んでみて、errno=ENOSYS で返ってきたらもう使わないように工夫されてます。

svn:r33562 2011-10-30 07:48:45 +0900

version.h の日付更新。

akr:r33563 2011-10-30 08:30:34 +0900

rb_cloexec_dup2() にて複製先にしようとしている file descriptor が標準入力/標準出力/標準エラー出力だったら dup3(2) を使って close-on-exec フラグを立てないようにしています。

akr:r33564 2011-10-30 10:02:46 +0900

rb_cloexec_dup() においても fcntl(2) で file descriptor を複製する時に 標準入力/標準出力/標準エラー出力が複製先にならないようにして、これらの file descriptor に close-on-exec フラグが立たないようにしています。

nobu:r33565 2011-10-30 10:47:23 +0900

rb_cloexec_dup() と rb_cloexec_dup2() で dup3(2) または fcntl(2) で close-on-exec フラグを付加しつつ複製に成功した場合はその後の fd_set_cloexec() を呼ぶ必要がないのですぐ return するようにしています。

nobu:r33566 2011-10-30 10:50:38 +0900

MinGW でインストール先をディスクのルートに直接入れるように指定した時に tool/rbinstall.rb がファイルパスの操作に失敗してインストールできない不具合を修正。どうやら Windows 版ではファイルパスの先頭に "//dir" のようにデリミタが2つ重なると特別な意味を持つため(UNC Path?)、File.dirname や File.basename が思わぬ動作をするようです。そっちを直してないのでこの動作自体は仕様のようですが、rbinstall.rb では正規表現を使ってパスを切り取るようにしています。 [ruby-core:40462] [Bug #5492]

akr:r33567 2011-10-30 18:46:56 +0900

起動時に標準入力、標準出力、標準エラー出力の file desctiptor (0,1,2) が閉じられていたら pipe を作ってこれらを埋めておく処理を追加しています。

akr:r33571 2011-10-30 20:07:09 +0900

rb_cloexec_dup() と rb_cloexec_dup2() の成功時の処理をすこしシンプルに修正しています。

akr:r33572 2011-10-30 21:13:05 +0900

pipe(2) を wrap して close-on-exec フラグ付加する公開API rb_cloexec_pipe() を追加して、これを利用するようにしています。