From: matz@... (Yukihiro Matsumoto) Date: 2000-11-26T02:16:13+09:00 Subject: [ruby-list:26165] Re: fork problem? まつもと ゆきひろです In message "[ruby-list:26163] Re: fork problem?" on 00/11/26, Tanaka Akira writes: |えぇと、unix domain socket である種の non-forking server を作っている |のですが、時おり、その中から外部のコマンドを起動する必要があります。 |ここで何も考えずに fork/exec を使ってコマンドを起動すると、server が保 |持している UNIXServerだの UNIXSocket だの(に対応する filede scriptor) |が継承されるわけです。そして、このコマンドは長い間生き残るので、トラブ |ル(EOF が検出不能になる)が起きます。 状況はわかりました。もし可能であれば、作りかけのRuby版とエラー を発生させる起動法に関する情報があるとこちらでいろいろ実験で きるので助かります。 |で、close さえできれば解決するわけですが、 | |1. 普通に IO#close するとその file descriptor を待っているスレッドに | IOError が発生する。 | | ちゃんと IOError を全部捕まえれば動くんじゃないかとは思うのですが、 | いまのところ成功していません。いまひとつ何が起きているの把握できなく | て... forkしてからcloseすれば良いのかしら? |2. close-on-exec を設定しておく。 | | IO#fcntl では (OpenFile の)f2 を扱えないのでうまくいきません。そもそ | も、なぜ UNIXServer や UNIXSocket はわざわざ dup して f2 を設定する | のか、というのも疑問ですが... half close な状態を表現するため? | | # ついでにいえば socketpair がある環境では rw な popen でも f2 は使 | # わないでほしい。 dupしているのはstdioのコードをソケットに対しても適用可能にす るためです。stdioがseekなしで読み書きできればこんなことはし なくても済むのですが。 # その度に浮上する stdio を捨てる案。でも、拡張ライブラリや、 # その先のライブラリが使っている stdio との不整合が...。 IO#fcntlやIO#ioctlがfとf2の両方にfcntl(2), ioctl(2)を呼べば 済む問題だといいんですが、どうなんでしょう? まあ、たとえこの問題は解決しなくても、この件については対応し た方が良さそうですが。 |fcntl(など)を f2 に発行できるようにするか、 |fork した当の thread 以外の thread をすべて有無を言わさず殺すような fork |(Thread.fork_and_kill_other_threads とか?)があるといいんじゃないかなぁ、 |と思っています。 forkとthreadを混ぜるのはかなり問題の元です。 いっそ、fork_and_kill_other_threadsをforkの標準仕様にしちゃ いましょうか。 まつもと ゆきひろ /:|)