title=Win32ネイティブ版Rubyの互換性問題


((<Win32ネイティブ版>))Rubyは、できる限りUnix版と同等の動作をするように
意図して作られていますが、
OS自体の制限などにより、いくつかの非互換性があります。また、実装上の制限・
バグもいくつか残っているようです。

注意: このドキュメントは現状では不充分です。気づいたことのあるひとは
どんどん書き足してください。((-書き始めてみたはいいけどきりがない？^^;--ひだか-))


== プロセスの扱い

最も重要な違いとして、fork が動作しないことがあげられます。Unix向けに書かれている
デーモン系のアプリケーションが動かないのはこれが原因であることが多いでしょう。

== 実行権限の扱い

setuid などのプロセスの実行権限に関するメソッドは、(NT環境であっても)期待した
動作はしません。

== ファイルシステムの問題

Win32のファイルストリームにはテキストモードとバイナリモードの区別が存在します。
何も考えずに "w" などのモードでファイルに出力すると、\n → \r\n 変換が
起きるために、バイナリデータが破壊されるという問題が起きます。

File.chmod は読み出し許可・書き込み許可属性のみ操作できます。group/other に対する操作や実行許可の操作は無視されます。File.chownはエラーを返しませんが実際には何も行いません。

ドライブレター絡みで未だに幾つかの実装上の漏れがあります--((<DOSISH 対応>))。
また、同様に、-Ksを指定してあっても、日本語ファイル名の扱いで問題が発生する
ことがあります。

== シェルの違いによる問題

Win32 ネイティブ版では、通常は外部シェルとして command.com / cmd.exe が
使われます。そのため、Kernel#system メソッドなどでシェル経由で外部コマンドを
起動した場合、プロセス制御などの操作を利用することはできません。
((-余談ですが、Cygwin bash から起動したら bash が使われたのではまりました。
こんなボケはぼくだけかも。。。-))

== IO.popenの問題

"r+"・"w+"は使えません(1.6)。
また、"r"もうまく動かないことがあるようです(1.6のみ)。

== 1.7 系では解決している問題

* socket / select の併用時の問題? ((<URL:http://www.notwork.org/ipr/webrick/webrickja/0/13.html>))

== Windows のメッセージハンドラとRubyスレッドの併用時の問題

VisualuRuby, FOX, ((<Apollo>)) などのWindows上でのGUIツールキットとRubyスレッドを
併用する場合、メッセージハンドラでスレッドを生成すると、
落ちます((<ruby-ext:1940>))。
1.6.8以降ではこの問題は解決されています。

== IOとRubyスレッド併用時の問題

Win32ネイティブ版ではIO待ちはスレッドをブロックします。
現時点では適当な解決策もありません。

== その他

