ふにゃるん

2005-08-07 あづー

[] Cygwinで、pipeやforkを使うとエラーが起きる場合の対策方法 12:52  Cygwinで、pipeやforkを使うとエラーが起きる場合の対策方法を含むブックマーク

ってな訳で、IPython for Cygwinでポチポチ弄って遊んでいる訳だが。

help関数を呼び出すと、エラーが起きたりする。

In [1]: import sys

In [2]: help(sys)
      4 [main] python2.4 4488 fork_parent: child 4736 died waiting for dll loading
---------------------------------------------------------------------------
exceptions.OSError                                   Traceback (most recent call last)
...
/tmp/python.572/usr/lib/python2.4/pydoc.py in <lambda>(text)
   1321         return lambda text: tempfilepager(plain(text), 'more <')
   1322     if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0:
-> 1323         return lambda text: pipepager(text, 'less')
   1324 
   1325     import tempfile

/tmp/python.572/usr/lib/python2.4/pydoc.py in pipepager(text, cmd)
   1340 def pipepager(text, cmd):
   1341     """Page through text by feeding it to another program."""
-> 1342     pipe = os.popen(cmd, 'w')
   1343     try:
   1344         pipe.write(text)

OSError: (0, 'Error')

むぅ。困った、困った。

どうやら、pipeを使う所でエラーが起きるみたいなんだな。

ちなみに、拡張モジュールを突っ込んでみた時 気付いたんだが、fork 関数を呼び出すと 同じようなエラーが起きる。


ってんで、ぐぐーる先生にお伺いを立てると、以下が見つかった。

電脳Rubyプロダクツ Cygwin binaries

http://ruby.gfd-dennou.org/tutorial/install/cygwin/package-j.html

rebase問題

CygwinRubyプログラムを動かしていると,

...

D:\cygwin\bin\ruby.exe: *** unable to remap D:\cygwin\bin\cygssl.dll to same address as parent(0xDF0000) != 0xE00000

...

みたいなメッセージが延々と出力されてどうしようもなくなることがあります.

このようになったときは,そのプログラムを中止し,

$ rebaseall

というコマンドを実行してやると回避できます.setup.exe から rebase というパッケージをインストールしておく必要があります.

これはRubyだけで起こる問題ではなく,Cygwin fork() の問題だそうです.詳しくは rebase のドキュメント (/usr/share/doc/Cygwin/rebase-x.x.README) などを見てください.

つまりは、rebaseall ってパッケージを突っ込んで、呼び出せばOKらしい。


rebase パッケージは、Systemカテゴリの下にある。

f:id:Wacky:20050807125413p:image

で、入れた後、呼び出すと こんなメッセージ。

$ rebaseall
rebaseall: only ash processes are allowed during rebasing
    Exit all Cygwin processes and stop all Cygwin services.
    Execute ash from Start/Run... or a cmd or command window.
    Execute '/bin/rebaseall' from ash.

ふむふむ、一旦サービスを止めて、ashシェル上で動かせ。っていう事らしい。

という訳で、次の手順で実行。

1.スタートメニュー→ファイル名を指定して実行。

2."ash"といれて実行。(Cygwinの/bin フォルダにパスを通しておいて良かった)

f:id:Wacky:20050807125420p:image

3."rebaseall"を呼び出す。

f:id:Wacky:20050807125434p:image

rebaseallの呼び出しは、凡そ10数秒くらいだった。

で、再度 Cygwinシェルから IPythonを立ち上げて、helpコマンドを呼び出す。

In [1]: import sys

In [2]: help(sys)

f:id:Wacky:20050807125449p:image

ちゃんと動いたよ。うひょ。