33

私はコンソール モードの Windows アプリケーション (Unix から移植) を持っていますが、これはもともと受信時にクリーンな終了を行うように設計されていました^C(Unix SIGINT)。この場合の正常な終了には、リモート ネットワーク接続が終了するまで、かなり長い時間待機する必要があります。(これが の通常の動作ではないことはわかっていますが^C、変更する立場にはありません。) プログラムはシングルスレッドです。

(Unix の場合のように) または の^Cいずれかでトラップできます。プログラムが CMD.EXE の下で実行されている場合、どちらも正しく機能します。ただし、MSYS に付属の「bash」シェルを使用すると (プログラムのビルドに MinGW 環境を使用しています。これにより、Unix メイクファイルを再利用できるようになります)、プログラムはランダムな短い時間 (より短い時間) 強制的に終了します。 100 ミリ秒) の後に. 前述したように、プログラムはリモート ネットワーク接続が終了するまで待機する必要があるため、これは容認できません。signal(SIGINT)SetConsoleCtrlHandler^C

このプログラムを MSYS bash の下で実行したいと思う人は多いでしょう。また、この影響によりテスト スイートが壊れます。プログラム内から (理想的)、またはシェルの設定によって (許容可能)、問題を回避する方法を見つけることができませんでした。誰でも何かお勧めできますか?

4

6 に答える 6

8

私はまったく同じ問題を抱えていました-SIGINT/SIGTERMハンドラーを使用してプログラムを作成しました。そのハンドラーは、時々時間がかかるクリーンアップ作業を行いました。msys bash 内からプログラムを実行すると、ctrl-c によって SIGINT ハンドラーが起動しましたが、終了しませんでした。プログラムは、クリーンアップが完了する前に (いわば「外部から」) 終了されました。仕事。

phs の回答に基づいて構築し、同様の質問に対するこの回答: https://stackoverflow.com/a/23678996/2494650、次の解決策を思いつきました。それは非常にシンプルで、まだ発見していない副作用があるかもしれませんが、問題は解決しました.

次の行で ~/.bashrc ファイルを作成します。

trap '' SIGINT

それでおしまい。これにより、sigint シグナルがトラップされ、msys bash が「外部から」プログラムを終了するのを防ぎます。ただし、何らかの方法で SIGINT シグナルをプログラムに送信し、適切なクリーンアップ/シャットダウンを実行できるようにします。なぜこのように機能するのか正確にはわかりませんが、少なくとも私にとってはそうです。

幸運を!

于 2015-08-12T20:41:13.350 に答える
0

プログラムを MSYS bash で実行する場合、実行可能ファイルを直接実行しますか、それともラッピング (bash) シェル スクリプトがありますか?

その場合、カスタム Ctrl-C ハンドラーをtrapコマンドに登録している可能性があります (スリープの後に kill を実行します)。そのようなものが存在する場合は、それを変更または削除します。

登録されていない場合trap、またはラッピング スクリプトがない場合は、そのようなスクリプトを作成し、独自のトラップを追加してデフォルトの動作を上書きすることを検討してください。ここまたはbash の man ページ(SHELL BUILTINS セクション) で使用方法の例を確認できます。

于 2011-09-04T21:28:19.017 に答える
0

Ctrl-C は SIGINT ですか? Ctrl-Z は SIGINT だと思っていましたが、Ctrl-C は SIGTERM です。それを確認します。

于 2011-09-05T20:52:26.310 に答える
0

CYGWIN 環境設定はありますか (コントロール パネル/環境変数内)? CYGWIN=notty を設定して再起動し、新しい MSYS bash シェルを開きます - 問題は解決しませんか?

于 2011-09-06T19:20:21.407 に答える