私のコードのセクションを実行したいが、完全に終了する前に割り込み(ctrl-c)するオプションを付けて、残りのコードの実行を再開する。 (私はLinuxプラットフォームで作業しています)メソッドを中断してもコードの残りの部分を実行し続ける
私の推測では、フォークを作成してメソッドを呼び出し、シグナルハンドリングを使用します。信号処理にはどのようなステップが必要ですか?
void Manager::Run()
{
pid_t pID = fork();
if(pID<0)
exit(1);//give up here
else if(pID==0) {
BuildList(); //I'd like the option to ctrl-c this only
//some code here catch user signal interrupt?
}
else {;}
waitpid(pID,NULL,0);//pause until BuildList() is done or interrupted
PrintList();
}
if/else部分のどこかにシグナル(SIGINT、sigint)のような行を使いたいと思うようです。そして、私はこのような関数を定義する必要があります:
sigint(int param){ signal(param, SIG_DFL);};
私は子プロセスを殺すしかありません。
これは私の問題を解決する正しい考えですか?もしそうなら、この作業にはどのような信号処理が必要ですか?
UPDATE:
より完全に私の質問に対処するために、私が提案した非フォーク方法を検討しました。私はフォークなしでこれを行うことができるはずです。残念ながら、私はいくつかの試みからコンパイルエラーに悩まされています。私は更新されたコードと新しいエラーを含んでいます。
static void sighandler(int signum)
{
PrintList();
exit(1);
};
sighandler機能は、私はこれを取得静的でない場合Manager.ccは
void Manager::Run()
{
signal(SIGINT,sighandler);//sets up sighandler()
BuildList(); //add elements to a list
signal(SIGINT,SIG_DFL); //restore default
PrintList();
}
が含まれています:Managerでコールsignal(SIGINT,sighandler)
に
error: argument of type 'void (Manager::)(int)' does not match 'void (*)(int)'
を:: Run()を実行してハンドラを設定します。
私は静的sighandler機能で、私はこの取得がprintlist()を呼び出す場合:sighandlerにPrintList();
コールに
error: cannot call member function 'void Manager::PrintList()' without object
を()。
最後に、PrintList()を静的関数(static sighandlerを使用)にすると、Listおよびiteratorでこれらのエラーが発生し、リストをステップ実行することに注意してください。
error: invalid use of member 'Manager::theList' in static member function
error: invalid use of member 'Manager::it' in static member function
これらのエラー周りの任意の巧妙な方法?
私は信号の問題を別の質問にするべきだと思います。元の質問への回答を受け入れると、回答が得られる可能性が高くなります。 –