[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) が動作します。

In This Thread