C ++の "システム"待機なし(Win32)

私はサーバーにバージョンの更新があるかどうかをチェックするプログラムを持っています。今私は何かをする必要があります

if(update_avail) {
    system("updater.exe");
    exit(0);
}

「updater.exe」が完了するのを待たずに。それ以外の場合は、実行中のためメインプログラムを置き換えることができません。では、 "updater.exe"を実行してすぐに終了する方法は?私は fork を使って* nixの方法を知っているので、Windowsでこれを行う方法は?

2
追加された 著者 CharlesB,

3 答え

CreateProcess()、非同期に実行されます。その後、元のプロセスが終了するまで待つか再試行することで、元のEXEに書き込むことができるようにするだけです。 (猶予期間はもちろんです。)

5
追加された

Win32には fork()はありません。探しているAPI呼び出しは、 :: CreateProcess()と呼ばれます。これは、system()が使用している基礎となる関数です。 :: CreateProcess()は本質的に非同期です。返されたプロセスハンドルを特に待っていない限り、呼び出しは非ブロックです。

また、プロセス標準I/Oをリダイレクトしたり、プロセスの待機をしていない場合に使用できる、より高度な関数 :: ShellExecute()もあります。これには、実行可能ファイルのシステムPATHを検索する利点と、バッチファイルを起動する機能と、ドキュメントファイルに関連付けられたプログラムを起動する機能があります。

4
追加された

それにはスレッドが必要です ここを見てください: http://msdn.microsoft.com /en-us/library/y6h8hye8(v=vs.80).aspx あなたは現在、 "メインスレッド"(あなたのフレームコードでもあります)にあなたのコードを書いています。 したがって、完了するまでに時間がかかるものを実行すると、メインスレッドの実行を停止します.2番目のスレッドで実行すると、メインスレッドは続行されます。

更新: 私はあなたがすぐに終了したい部分を欠場しています。 execl()はあなたが望む可能性が高いです。

#include 

int main(){

    execl("C:\\path\\to\\updater.exe", (const char *) 0);
    return 0;
}

推奨されるCreateProcess()も同様に使用できますが、execlはPOSIXに準拠しています。

#include 
extern char **environ;
int execl(const char *path, const char *arg, ...);

更新:  コンパイラとしてgccを使ってWin-7でテスト

0
追加された
まず、execl()は私の知る限りWindowsの一部ではありません。次に、fork()も必要ありませんか?これらは、CygwinとMKSでのみ私がWindows上で知っている限り存在します。
追加された 著者 Prof. Falken,
あなたが使っているGCCはCygwinではありませんか?そこには多くの参考文献がありますが、SOを提供するには: stackoverflow.com/questions/23397/…
追加された 著者 Prof. Falken,
そのコードは移植性がありません。 UNIXでは、その前にfork()を置く必要があります。そうしないと、同じプロセスを使用してexeをロックします。 Windowsでは、おそらく仕事のように思えますが、偶然によってのみ起こります。例えば、 mingw-users.1079350.n2を参照してください。 .nabble.com /… また、execl()はWindows APIではありませんが、おそらくMingwが追加しているものです。あなたが提供しているMSDNへのリンクには、execl()については何も言われていません。あなたがなぜそれをインクルードしたのかわかりません。私はあなたのコードをテストしていない、私は今すぐツールがありません。あなたはVisual Studioでそれをテストしましたか?私はexecl()がmingwだと思う
追加された 著者 Prof. Falken,
OPがどのようなものを使用しているのかそれはどのコンパイラではなくWindowsだけであると言います。その後、Windows APIのみを提案する必要があります。 execl()はLinux上で更新されるかもしれませんが、それについてはわかりません。あなたは "textfile busy"を得ることができます。これはWindows上で動作する可能性がありますが、execl()セマンティクスはMingwではLinux/POSIXとは異なるためです。私があなたに与えたリンクを読んだことはありますか?私はこれ以上論争しません...
追加された 著者 Prof. Falken,
追加された 著者 Prof. Falken,
コンパイラとしてGCCを使ってWindows上でコードをテストしたところ、上手く動作しました。 Visual C ++がインストールされていませんが、なぜサポートしていないのですか? fork()は別の種類のスレッド(unix flavoredとsimple thread)です。 execlは、プロセスイメージを新しいものに置き換えます。私はOPが彼がやろうとしたことを理解していました。
追加された 著者 John,
いいえ、通常のgccコンパイラです。私はかなり標準的だと思います。私の例はあなたのために働いていないのですか?
追加された 著者 John,
ユーザーは、updater.exeを実行して待たずに閉じるプログラムを持っていたがっていました。 execl()を使って正確にこれが起こります。 updater.exeがプロセスに移動されるため、execl()はupdater.exeを実行し、元のプログラムはもう存在しません。それはWindowsとLinuxのように動作します。私はVisual Studioを使用していませんが、それはそれをサポートしていないとは思っていませんが、OPでもそれを使用していますか?
追加された 著者 John,
ファイルに触れていないので、 "textfile is busy"を取得することはできません。それは置き換えられるメモリイメージです!あなたのリンクについて:execlがforkされたプロセスで使われることは意図されていないので、execl()を使うときは何も起こらない、フォークされたアプリケーションをバックグラウンドで起動するためにsetpid()が必要です。それがうまくいくかどうかはわかりません。
追加された 著者 John,