重複の可能性:
Windows 上の C++ でプロセスを作成する方法は?
Windows で 1 つのプログラムを別のプログラムから実行するにはどうすればよいですか? そして、なぜsystem()
悪いのですか?私はこれを読みましたが、Unix の観点からトピックをカバーしているようです。
重複の可能性:
Windows 上の C++ でプロセスを作成する方法は?
Windows で 1 つのプログラムを別のプログラムから実行するにはどうすればよいですか? そして、なぜsystem()
悪いのですか?私はこれを読みましたが、Unix の観点からトピックをカバーしているようです。
子プロセスの生成は、オペレーティングシステムに非常に依存する手順です。stdlib.hのsystem()は、Unix環境を念頭に置いて設計されており、スレッドセーフではありません。system()の使用は、どのC環境でも機能しますが、結果は厳密には定義されていません。また、system()を使用する場合、親プロセスは子プロセスが終了するまで待機する必要があり、アプリケーションの速度が大幅に低下します。
より詳細な制御と監視が必要な場合は、より高度なオプションがあります。UNIX システムには、fork() 関数と exec() 関数があります。特に Windows の場合、CreateProcess() 関数があります。
第二に、
system()
単純なプログラムには問題ありませんが、システムは柔軟性が低く、C/C++ 言語に実装されたものよりもはるかに遅くなります。
プログラムを別のプログラムから実行する簡単な方法があります。別のプログラムから HelloWorld.cpp を実行したいとします。次のように書くだけです:
#include<iostream>
using namespace std;
int main(void)
{
system("g++ -o abcd HelloWorld.cpp && ./abcd");
return 0;
}
(これは、プログラムが現在のディレクトリにあることを前提としています。)
system
悪魔ではありません。それは単に、ほとんどの場合、意図していないことです。
まず第一に、あなたが求めていることはほとんど不可能です: OS がプロセスを管理する方法は、OS を別の OS とは異なるものにするものの 1 つです。したがって、すべての OS で動作する単一の方法を期待しないでください。
のような非常に基本的な機能を使用している場合を除きますsystem
。しかしsystem
、実際には、プログラムを起動するだけではありません。OS の既定のコマンド インタープリターを起動し、その関数に渡した文字列を渡します。ほとんどの OS では、これによりプログラムが起動されます。しかし、その後に何が起こるかは、ターゲット OS が何であるかだけでなく、それがどのように構成されているか、および呼び出しを行うプロセスがそれに関してどのような特権を持っているかにも依存します。
このようなコマンドをだますのは非常に簡単です。インタープリターに、呼び出したいプログラムと同じ名前の検索パスに沿ってバッチ ファイルを見つけさせるだけで、それが実行されます。あなたのコードに触れなくても、誰でも、あなたやあなたのユーザーに何も知らずに、好きなようにコードを実行することができます。トロイの木馬のための非常に素晴らしいヒッポドローム!特にセキュリティが重要な場合、頼りになるものではありません。
しかし...一連のシステムアクションを自動化することを目的とするシステムユーティリティを作成している場合は、system
おそらく必要なものです。
system() が悪いのはなぜですか?
それ自体が悪いかどうかはわかりませんが、別のプロセスを生成している場合は、ほとんどの場合、プロセスを何らかの形で制御したいと考えています。ShellExecuteのような呼び出しは、プロセスを微調整するためのより多くのオプションを提供し、とりわけ、さらなる通信に使用できるハンドルを取得します。system()
OTOH は、プロセスが開始されたかどうかを示しません。
Windows プログラミングを行っている (そして移植性を必要としない) 場合は、可能な限り WinAPI を使用することをお勧めします。たとえば、ファイル処理、共有メモリなど。