web-dev-qa-db-ja.com

system()コマンドの終了を待たない方法はありますか? (c)

に類似:
system()の呼び出し後にプログラムが何も実行しない

私はCを使用するのはかなり新しいですが、基本的には、次の行を実行します:

int a = system("python -m plotter");

私が開発したpythonモジュールを起動します。ただし、コマンドの実行が完了するのを待つのではなく、残りのcプログラムを実行し続けたい(pythonアプリは無限ループにあるため、自動的に閉じません)。 C/C++を使用してこれを行う方法はありますか?

更新:解決策は:

int a = system("start python -m plotter &");
29
gh4x

system()は単純に引数をシェルに渡します(Unixのようなシステムでは、通常_/bin/sh_)。

これを試して:

_int a = system("python -m plotter &");
_

もちろん、system()によって返される値は、pythonスクリプトの終了ステータスではありません。まだ終了していないためです。

これは、Unixライクシステム(おそらくMacOSを含む)でのみ動作する可能性があります。特に、Cygwinで実行している場合を除き、MS Windowsではおそらく動作しません。

Windowsでは、system()はおそらく_cmd.exe_を呼び出します。これは、Unixのようなシステムで使用されるのと同じ構文のコマンドを受け入れません。しかし、Windowsのstartコマンドが仕事をするはずです:

_int a = system("start python -m plotter");
_

Windows固有のコードを書いている限り(たぶん_$PATH_にstartコマンドがなければ、startはUnixで動作しません)、おそらく StartProcess を呼び出すことによる、下位レベルのWindows機能。それはより複雑ですが、プロセスの実行方法をより詳細に制御できる可能性があります。一方、system()が要件を満たしている場合は、それを使用することもできます。

34
Keith Thompson

標準ライブラリには方法がありませんが、OSがサポートしている場合、バックグラウンドで実行する別のスレッドを分岐または作成できます。

4
littleadv

コマンドの最後に「&」を追加すると機能すると思います。 '&'は、コマンドをバックグラウンドで実行するように指示します

int a = system("python -m plotter &");
4

Linuxの「システム」コマンドは、それ自体の実行が完了した場合にのみ、残りのコードを実行させます。

同時処理が必要な場合は、fork()を使用する必要があります。

2
jscode

これに対するWordは、非同期関数/メソッド呼び出しです。 CとC++にはこのような機能がないため、関数を別のスレッドで呼び出すか、別のプロセスで実行するシステムコールを使用する必要があります。これらのメソッドは両方ともプラットフォーム固有である傾向がありますが、クロスプラットフォームスレッドライブラリがあります。

UNIXでは別のプロセスでこれを行うには、 fork(2) を使用して新しいプロセスを作成し、 exec(3) を使用して新しいプログラムを実行することを知っています処理する。 Windowsでどのシステムコールが必要になるかはわかりませんが、似ているはずです。

1
David Brown