他のプロセスを作成する必要があるプログラムを作成しようとしています。私は Windows API に慣れていますが、今では自分のプログラムを Linux プラットフォームでも実行できるようにする必要があります。
ポータブルな方法でそれを行うことは可能ですか?そのためにプリプロセッサを使用する必要がありますか?
編集:物事を続ける前に、それが完了するのを待つ必要があります。
他のプロセスを作成する必要があるプログラムを作成しようとしています。私は Windows API に慣れていますが、今では自分のプログラムを Linux プラットフォームでも実行できるようにする必要があります。
ポータブルな方法でそれを行うことは可能ですか?そのためにプリプロセッサを使用する必要がありますか?
編集:物事を続ける前に、それが完了するのを待つ必要があります。
私の意見では、システム関数は常に避ける必要があります。どのシェルがコマンドを処理するかわからず、明確なエラーコードを返す手段がないため、信頼性が低くなります。さらに、プロセスが非常に重いWindowsのようなプラットフォームでは、別のプロセスを起動するためだけに新しいプロセスを起動することはお勧めできません。ちなみに、一部のセキュリティスイートは、アプリが起動しようとするプロセスごとに警告を発する場合があります。この通知を2倍にすると(1つはコマンドインタープリター用、もう1つは実際に起動されたアプリ用)、ユーザーを2倍悩ませる可能性があります。
新しいプロセスを作成する必要がある場合は、実際のプラットフォーム固有のコードの周りにラッパー関数を作成するだけで済みます。ラッパー関数は、プリプロセッサのおかげでプログラムがコンパイルされるときに自動的に選択されます。このようなもの:
int CreateProcess(const char * Executable, const char * CommandLine)
{
#if defined (_WIN32)
return CreateProcess(Executable, CommandLine /* blah blah blah */)!=FALSE;
#elif defined (_POSIX)
/* put here all the usual fork+exec stuff */
#else
#error The CreateProcess function is not defined for the current platform.
#endif
}
ちなみに、関数はブロックするように簡単に拡張できます。win32セクションのWaitForSingleObjectとPOSIXのwaitpidをトリガーするフラグ(int Blocking、またはブール値のC99で現在使用されているもの)を追加するだけです。セクション。
APIは異なるため、2つのコードを記述したり、同じことを行うライブラリにリンクしたりする方法はありません。
Apache Portable Runtimeは、Cでポータブル低レベルプログラムを作成するための優れたオプションです。
Posix と Windows の両方に存在する system() を試してください。
@Jeff - system() はブロッキング呼び出しであり、子プロセスが終了するまで返されません。