コンソールアプリがトラップSIGINT
されるため、正常に終了できます。
ただし、プログラムのデバッグ中にXCode内でCTRL+を押しても効果はありません。C
プロセスを見つけてターミナルウィンドウを使用しSIGINT
てプロセスに送信することはできますが、XCode内で実行できるより簡単なソリューションがあることを望んでいます。
デバッガコンソールの一時停止ボタンは、実際にSIGINTをアプリに送信します。デバッガーにシグナルをアプリに渡させる場合は、次の操作を実行できます。
handle SIGINT pass
を押しますXcodeのデバッガコンソールの[一時停止]ボタンをもう一度押すと、SIGINTがアプリにヒットします。
SIGINTがキャッチされたらすぐにデバッガーを停止したくない場合は、前のリストに追加することもできます。handle SIGINT nostop
2017年のアップデート/ Xcode8:割り込みを処理する意図をlldbに通知するための適切なコマンド:
process handle SIGINT -s false
process handle SIGINT -p true
私の経験では、上記のコマンドを使用しても、デバッガーの一時停止機能によってアプリが中断され、デバッガーのスタックポインターに制御が渡されますがpkill -2 appname
、ターミナルのaは、デバッガーとの対話なしで割り込み機能をトリガーします。たとえば、次のようになります。
void on_signal(int sig) {
is_interrupted = 1;
}
int main(int argc, const char * argv[]) {
signal(SIGINT, on_signal);
// ... do stuff
}
Xcode 5+(llvm)の場合:
プロセスを一時停止します
(llvm)
プロンプトで、次のように入力しますprocess signal SIGINT
実行を再開する
1つの解決策は、UNIXkill
またはkillall
コマンドを使用することです。
プロセスIDがわかっている場合は、ターミナルアプリケーションを開いて次のように入力できます。
kill -SIGINT 415
(ここで、415はこのプロセスのPIDです)
または、おそらくもっと簡単に、入力することができます
killall -SIGINT my_console_app
(my_console_app
アプリの名前、つまり作成されたバイナリの名前はどこにありますか。バンドルに含まれている場合はバンドルではありません)
これにより、名前が示すように、アプリケーションのすべてのインスタンスにシグナルが送信されるため、killall
適切でない場合があります。killall
(;を実行する前に、同じ名前の他のプロセスが実行されているかどうかを確認する価値があるかもしれません。
割り込みを処理する手間を省くための回避策の1つは、要求されたルーチンを実行するCTRL-Cショートカットを使用してMainMenuを作成するSIGINT
か、本当にsigが必要な場合はそれ自体を送信することです。