次を使用して、ターミナルでプログラムを開くことができます。
stringstream s;
s<<"./~/rajat/app -parameter";
system(s.str().c_str());
私のアプリはターミナルで実行され続けます。私がやりたいのは、同じプログラム内からこのアプリをシャットダウンし、新しいパラメーターを使用して再度開くことです。これを行う方法?
を使用してこれを行うことはできませんsystem
。(BSD) からman 3 system
:
呼び出しプロセスは、シェルがコマンドの実行を終了するのを待ち、SIGINT と SIGQUIT を無視し、SIGCHLD をブロックします。
したがって、アプリは、起動されたプログラムが完了するか終了するまでブロックされます。
代わりに、こことここfork
の/ exec
-man ページを使用してプログラムを起動することで、必要な動作を得ることができます。これは、ボンネットの下で行っていることです。サブプロセスを起動し、アプリで制御を維持します。system
を使用するfork
と、起動したプロセスのプロセス ID を取得できます。これを使用して、たとえば、kill
man page hereを使用してプログラムを終了し、プログラムを再起動できます。
fork
/の例を探してくださいexec
。おそらく、このサイトにはいくつかあります。
system()
別のプロセスを起動して、その終了コードを取り戻すことしかできません。他のプロセスのライフサイクルを制御することはできません。
他のプロセスを開始して制御する場合は、他の方法を使用する必要があります。古典的な方法は、fork()
あなた自身のプロセスを2つに、exec()
そして他のプロセスを子にすることです。次に、親は呼び出しから子のPIDを取得し、fork()
終了するときに親から子に適切なシグナルを送信できます。
これは少し面倒ですが(特にSIGHUPを処理し、ゾンビプロセスをクリーンアップする必要がある場合)、厄介なビットを実行する標準ライブラリまたはBoostライブラリを認識していません。ただし、これを手動で書き始める前に、おそらく確認する必要があります。
と一緒に行く場合はfork()
、何十年にもわたってその周りに構築されてきた詳細とイディオムを紹介するガイドがオンラインにたくさんあります。