LinuxでC++プログラムに別のプログラムを開くにはどうすればよいですか? シェルコマンドを使用したWindowsの場合と似ていますか?
5 に答える
system()
コマンドを実行し、その終了を待機する標準 C 関数があります。
popen()
新しいプロセスでコマンドを実行し、新しいプロセスに接続されたパイプを返す標準の POSIX 関数があります。パイプは通常、単方向であり、読み取りまたは書き込みのいずれかが可能です (BSD などの一部のプラットフォームでは双方向パイプが許可されています)。
fork()
または、POSIX関数を使用して新しいプロセスをフォークし、次にexec()
ファミリーの1つを使用して、プロセスイメージを別のプログラムに置き換えることにより、手動で行うことができます。
私が最も簡単だと思う方法は、私のPstreamsライブラリを使用することです。これは、新しいプロセスでコマンドを実行し、iostreams 互換のインターフェイスを使用して、パイプをそのstdin
、stdout
およびのいずれかに接続します。stderr
これにより、fork
&よりも制御が少なくなりますexec
が (ただし、はるかに単純です)、 よりも柔軟性と安全性が高くなりpopen
ます。
exec関数の1つを使用できます: http ://www.kernel.org/doc/man-pages/online/pages/man3/exec.3.html
標準のライブラリ呼び出しを使用できますsystem()
。これは、Windowsシェルコマンドと非常によく似ています。より詳細に制御するには、exec()
およびそのバリアントを使用できます。
通常、最初に関数forkを使用して別のプロセスを開始し、次にexecを使用して新しいプロセスが実行されているプログラム(つまり、別のプログラムを開始したいプログラム)を開始したいプログラムと交換します。コードはおおよそ次のようになります。
pid_t pid = fork();
switch(pid) {
case 0: // we are the child process
exec( name of exectuable ); //exact signautre differs
break;
case -1: //An error ocurred
std::cout << "error\n";
}
Forkは、実行中のプロセスのクローンを作成します。それらは完全に同一であり、同じプログラムを実行することさえあります。唯一の違いは、返されるpidです。呼び出しプロセスは子のpidを取得し、子はゼロを取得します。スイッチステートメントは、これらのどちらが当てはまるかを決定します。Execは、プロセスが実行しているプログラムを別のプログラムに置き換えます。私が覚えていることから、それはファイル記述子だけを保持します。Execには、引数と検索パスに関していくつかのバリエーションがあります。manページでそれらを調べてください。
関数を使用execl()
します。C言語用ですが、問題なく動作するはずです。詳細情報といくつかの例については、これをご覧ください: http://www.gidforums.com/t-3369.html