質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

1回答

886閲覧

[質問] msys2 mingw64 ruby Signal.trap(:INT) が動作しない?

roswell

総合スコア17

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/08/08 11:59

Windows msys2 mingw64

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 signal.rb # coding: utf-8 $stdout.sync = true p Signal.list # EXIT mignw fail # INT w pass mingw fail # QUIT mingw unsupported signal `SIGQUIT' (ArgumentError) # ILL mingw can't trap reserved signal: SIGILL (ArgumentError) # ABRT mingw fail # FPE mingw can't trap reserved signal: SIGFPE (ArgumentError) # KILL mingw Invalid argument - SIGKILL (Errno::EINVAL) # TERM mingw fail Signal.trap(:INT) { puts "まわって" puts "まわって" puts "まわって" exit } while true puts "とんで" sleep 3 end

を実行し、C-c すると、

yama@JPC00183513 ~/b/p/sample> ruby signal.rb {"EXIT"=>0, "INT"=>2, "ILL"=>4, "ABRT"=>22, "FPE"=>8, "KILL"=>9, "SEGV"=>11, "TERM"=>15} とんで とんで yama@JPC00183513 ~/b/p/sample>

と、Signal.trap(:INT) のブロックが実行されない症状に遭遇しています

一方
Windows コマンドプロンプトで、rubyのバージョンが少し異なりますが、

c:\yama\bin\platform\sample>ruby --version ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
c:\yama\bin\platform\sample>ruby signal.rb {"EXIT"=>0, "INT"=>2, "ILL"=>4, "ABRT"=>22, "FPE"=>8, "KILL"=>9, "SEGV"=>11, "TERM"=>15} とんで とんで とんで まわって まわって まわって c:\yama\bin\platform\sample>

と正常に動作します。

回避策などあれば、ご教示いただけますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Plain

1D:\Temp>uname -a 2MSYS_NT-6.1-7601 HOSTNAME 3.0.7-338.x86_64 2019-07-11 10:58 UTC x86_64 Msys 3 4D:\Temp>ruby -v 5ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]

ですが、正常に動作します。

とりあえず、

Ruby

1Signal.trap(:INT) { 2 puts "まわって" 3 puts "まわって" 4 puts "まわって" 5 exit 6} 7p Signal.trap(:INT) { 8 puts "まわって" 9 puts "まわって" 10 puts "まわって" 11 exit 12} 13 14while true 15 puts "とんで" 16 sleep 3 17end

で、トラップが効いているか確認してはどうでしょうか?
その次にどうしたら良いかは分かりませんが。

投稿2019/08/08 15:16

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roswell

2019/08/13 05:45

ruby の mailing list で、下記のような解説をいただき、 >msys2 mingw64 のターミナル(mintty)で実行した場合には、stdin, stdout, stderr は >msys2(cygwin) の pty をエミュレートするための pipe になっています。 >よって、ruby の Signal.trap(:INT) が動作しないのだと思います。 >したがって、mintty 中で動作させるためには winpty を使用する必要があります。 >手元では winpty を使用するとことで mintty 中でも Signal.trap(:INT) が動作します。 winpty を用いることで、対応できました。
otn

2019/08/13 05:57

minttyからの実行の話でしたか。
roswell

2019/08/13 06:02

msys2 mingw64 だと、mintty からいつも実行しているので、説明が足りませんでした。
otn

2019/08/13 06:04

minttyでやると、上記ではコメントになっている $stdout.sync = true をやらないと、putsしても表示が出ませんね。この時点で、通常の端末じゃ無いということが分かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問