[ruby-list:50809] Re: [質問] msys2 mingw64 ruby Signal.trap(:INT) が動作しない?
From:
ren kannagi <ren.kannagi@...>
Date:
2019-08-09 05:09:21 UTC
List:
ruby-list #50809
こんにちは。 On 2019/08/09 9:03, yamataka@u08.itscom.net wrote: > > yama@JPC00183513 ~/b/p/sample> > yama@JPC00183513 ~/b/p/sample> uname -a > MINGW64_NT-10.0-17763 JPC00183513 3.0.7-338.x86_64 2019-05-27 06:58 UTC x86_64 Msys > yama@JPC00183513 ~/b/p/sample> ruby --version > ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32] > yama@JPC00183513 ~/b/p/sample> cat signal2.rb > # coding: utf-8 > $stdout.sync = true > > begin > loop do > sleep 2 > puts "たこ" > end > rescue => Interrupt > puts “Interrupt” > end > yama@JPC00183513 ~/b/p/sample> ruby signal2.rb > たこ > たこ > たこ > > # Ctrl-c する > # puts "Interrupt" 表示されず > yama@JPC00183513 ~/b/p/sample> これも、以前の redebug でソースコードが表示されなかった問題と原因は一緒です。rubyの割り込みのソースを読んだわけではありませんが、おそらく Signal.trap(:INT) を動作させるためには、stdinがコンソールのハンドルである必要があるのだと思います。msys2 mingw64 のターミナル(mintty)で実行した場合には、stdin, stdout, stderr は msys2(cygwin) の pty をエミュレートするための pipe になっています。よって、ruby の Signal.trap(:INT) が動作しないのだと思います。したがって、mintty 中で動作させるためには winpty を使用する必要があります。手元では winpty を使用するとことで mintty 中でも Signal.trap(:INT) が動作します。