操作
バグ #2807
未完了coil/Routing.cpp のwait(NULL)は不要
開始日:
2013/08/27
期日:
2013/08/27 (11年以上 遅れ)
進捗率:
30%
予定工数:
説明
coil/Routing.cpp (posix版) 内で子プロセス終了を待つために wait(NULL) が数か所あるが、wait自体はpclose内に含まれているので不要
産総研の中岡です。 度々すみません、Mac OS X (Lion) においてマネージャ初期化時に固まるという 不可解な症状に遭遇しましたので、報告させてください。 状況としては、Choreonoidにおいて起動時にRTC::Manager::init()を行なってお り、ある条件下でこの関数が固まります。 固まる箇所をたどっていくと、 Manager::initNaming() - NamingManager::registerNameServer()- NamingManager::createNamingObj() - NamingOnCorba::NamingOnCorba() - coil::dest_to_endpoint() ときて、ここから呼ばれる coil::find_dest_ifname() と coil::ifname_to_ipaddr() の関数です。 1.1.0-RELEASEのsrc/lib/coil/posix/coil/Routing.cppにおいて、 108行と107行にある wait(NULL) でブロックしたまま帰ってきていません。 ある条件というのは、マネージャの初期化を行なっているプロセスから、 マネージャ初期化の前にネームサーバのコマンドを(別プロセスとして)起動し ているということです。同じコマンドをあらかじめ他のプロセスから起動してあ る場合は、問題なく動くのですが…。また、この症状が出るのはOS Xだけで、 WindowsやLinuxでは同じ事を行なっても問題なく動いています。 そして、OS Xでも上記の2つのwait(NULL)をどちらもコメントアウトすると、固 まらなくなり、その後も特に問題なく動いているように見えます。 ちなみにネームサーバのコマンドはomniNamesを参考に自前で実装した Choreonoid付属のものです。WindowsやMacではネームサーバがデーモンとして自 動では起動しないのが普通だと思いますが、そのような場合でもChoreonoidを起 動するだけで簡単にシミュレーションを行えるように、この機能をつけています。 以上のような症状なのですが、今後のリリースで上記のwait(NULL)を除去しても らうというのは問題ありますでしょうか?
n-ando さんが11年以上前に更新
- 進捗率 を 10 から 30 に変更
中岡さんより
安藤さん 本件ご確認いただきありがとうございます。 waitですが、wait(NULL)とすると、waitpidでpidに-1を指定したのと同じになる ようです。この場合、全ての子プロセスの終了を待つことになってしまいます。 そこで、waitではなくwaitpidの方の関数を使うようにして、pidのパラメータに 0を入れるというのはどうでしょう?こうしますと、「全ての子プロセス」では なくて、「プロセスグループidが親と同一の子プロセス」になるようです。(ち なみに、デフォルトではプロセスグループidは親と同じになるようです。) Choreonoidでは子プロセス起動時にプロセスグループidを変えるようにしていま すので、こちらを使えばブロックしないことを確認しました。 もう少し具体的に書くと、 wait(NULL); となっているところを、 waitpid(0, NULL, NULL); とすればOKです。 以上ご検討ください。 Choreonoidでは当面この修正を行うパッチファイルを配布に入れておこうと思い ます。 以上よろしくお願いします。
操作