mswin/Cygwin版Rubyにおける不具合調査

  • mswin版namarecoがどうにも動かないのでなるべく簡単なテストサンプルを作ってみた
#!/usr/bin/ruby

require 'readline'
require 'timeout'

th = Thread.new{
  puts 'debug1'
  begin
    timeout(3) {
      puts 'debug2'
      sleep 4
      puts 'debug3'
    }
  rescue Timeout::Error
  end
  puts 'debug4'
}

while buf = Readline.readline("% ", true)
end

th.join
$ ./namareco.exe
      3 [main] namareco 4820 X:\work\namareco\namareco.exe: *** fatal error - Incompatible cygwin .dll -- incompatible per_process info 0 != 168

普通の Ruby のソースならWindows上で動くどの Ruby でも実行ファイルにできるが、拡張モジュールを使う場合 Ruby-mswin32 じゃないとだめらしい。

Cygwin/MinGW対応が*暫定的*なのは、拡張ライブラリに対応していないからです。

      • つまりmswin32版じゃないとExerbで変換できないってことかな?一方でtimeoutはCygwinじゃないと正常動作しない困った
  • あとはまった点のメモ
    • Windowsの場合バイナリファイルはopen(file, 'w+b')のように開かないと改行コードを自動的にCR+LFにしてしまうらしい
      • Windows上では出力データサイズが大きくなってしまい結構悩んだ