英語版
このページの英語版を見る

std.process

他のプロセスを開始したり、他のプロセスとやりとりしたり、 現在のプロセスの実行環境で作業を行うための関数。

プロセス処理

  • 新しいプロセスを生成し、任意で標準入力、出力、エラーストリームの任意のセットを割り当てる。この関数は直ちに終了し、子プロセスは親プロセスと並行して実行される。すべての spawnProcess新しいプロセスを生成し、任意で 標準入力、出力、エラーストリームの任意のセットを割り当てる。 この関数は直ちに終了し、子プロセスは 親プロセスと並行して実行される。このモジュール内の他のすべての関数で プロセスを生成するものは、spawnProcess を中心に構築されている。
  • 親プロセスが子プロセスが終了するのを待つようにする。一般的に、親プロセスが終了する際に子プロセスが「ゾンビ」にならないように、常にこれを行うべきである。 スコープガードは、この目的に最適である。 wait親プロセスが子プロセスが終了するのを待つようにする。 一般的に、親プロセスが終了した際に子プロセスが「ゾンビ」にならないように、常にこの処理を行うべきである。 スコープガードは、この処理に最適である。 spawnProcesstryWaitwait と似ているが、 プロセスがまだ終了していない場合はブロックしない。
  • また、子プロセスも生成され、親プロセスと並行して実行される。ただし、任意のストリームを取得するのではなく、自動的にパイプのセットを作成し、親プロセスが子プロセスと通信できるようにする pipeProcessまた、子プロセスを生成し、 親プロセスと並行して実行する。ただし、 任意のストリームを取得するのではなく、自動的に パイプのセットを作成し、親プロセスが子プロセスと 子プロセスの標準入力、出力、エラーストリームを通じて 通信できるようにする。この関数は、Cのpopen 関数にほぼ対応する。
  • 新しいプロセスを開始し、 それが完了するまで待ってから戻る。さらに、 プロセスの標準出力とエラーストリームを取得し、 それらの出力を文字列として返す。 execute新しいプロセスを開始し、それが 完了するまで待ってから戻る。さらに、 プロセスの標準出力とエラーストリームを取得し、 それらの出力を文字列として返す。
  • spawnShellpipeShellexecuteShellそれぞれspawnProcesspipeProcessexecute のように動作するが、 ただし、単一のコマンド文字列を受け取り、それを 現在のユーザーのデフォルトのコマンドインタープリターで実行する。executeShell は、Cのsystem 関数にほぼ対応する。
  • 実行中のプロセスを終了しようとする。 kill実行中のプロセスを終了しようとする。
以下の表は、異なるプロセス作成関数を簡潔にまとめ、 それらが互いにどのように関連しているかを示している。
プログラムを直接実行する シェルコマンドを実行する
低レベルのプロセス作成 spawnProcess spawnShell
パイプを使用した自動入出力リダイレクト pipeProcess pipeShell
実行して完了を待ち、出力を収集する execute executeShell

その他の機能

  • pipe一方向パイプを作成するために使用される。
  • 現在のプロセスの環境変数を読み取り、操作できるインターフェースである。 environmentこれは、現在のプロセスの環境変数を 読み取り、操作するためのインターフェースである。
  • 、および escapeShellCommandescapeShellFileNameは、 ポータブルな方法でシェルコマンドラインを構築する際に役立つ。

ソースstd/process.d 注 このモジュールの機能のほとんどは、iOS、tvOS、watchOSでは利用できない。 これらのプラットフォームで利用できる機能は次のとおりである。

注釈: このモジュールの機能のほとんどは、iOS、tvOS、watchOSでは利用できない。 これらのプラットフォームで利用できる唯一の関数は、environmentthisProcessIDおよび thisThreadID

abstract class environment;
連想配列のようなインターフェースを使用して環境変数を操作する。
このクラスには静的メソッドのみが含まれており、インスタンス化することはできない。 使用例については下記を参照のこと。
static @safe string opIndex(scope const(char)[] name);
指定した環境変数の値を取得する name
auto path = environment["PATH"];
Throws: 環境変数が存在しない場合は、
Exception環境変数が存在しない場合、 または std.utf.UTFException変数に無効なUTF-16文字が含まれている場合 (Windowsのみ)。
See Also: 、失敗してもエラーを発生させない。
environment.get、失敗しても"スロー"しない。
static @safe string get(scope const(char)[] name, string defaultValue = null);
指定された環境変数の値を取得する name、 または変数が存在しない場合は既定値を返します。
environment.opIndexこの関数は、Posixでは決してスローしない。
auto sh = environment.get("SHELL", "/bin/sh");
この関数は、環境変数の存在を確認するのにも役立つ。
auto myVar = environment.get("MYVAR");
if (myVar is null)
{
    // 環境変数が存在しない。
    // 比較には'is'を使わなければならないことに注意してほしい。
    // myVar==nullは、変数は存在するが空である場合にも
    // 真になるからだ。
}
Parameters:
const(char)[] name 取得する環境変数の名前を指定し
string defaultValue 環境変数が存在しない場合に返すデフォルト値を指定する。
Returns: 環境変数が存在すればその値を返し、存在しなければ xml-ph-0000@deepl.internal を返す。
環境変数が検出された場合はその値、検出されなかった場合は null 。環境が存在しない場合。
Throws:
std.utf.UTFException変数に無効な UTF-16 文字が含まれている場合 (Windows のみ)。
static @trusted inout(char)[] opIndexAssign(return scope inout char[] value, scope const(char)[] name);
指定された値を value環境変数に指定された namevalueがNULLの場合、その変数は環境から削除されます。
変数が存在しない場合は作成される。すでに存在する場合は、 上書きされる。
environment["foo"] = "bar";
Throws:
Exception環境変数を追加できなかった場合 (例えば、名前が無効な場合など)

注釈 一部のプラットフォームでは、マルチスレッドのプログラムでは環境変数の変更が許可されない場合がある。 例えば、glibcを参照。

static nothrow @nogc @trusted void remove(scope const(char)[] name);
指定された環境変数を削除する name
変数が環境に存在しない場合、この関数は 何もせずに正常に終了する。

注釈 プラットフォームによっては、マルチスレッドプログラムで環境変数の変更が許可されない場合がある。 例えば、glibcを参照。

@trusted bool opBinaryRight(string op : "in")(scope const(char)[] name);
環境変数が定義されているかどうかを識別する。
この関数は値を返さないため、get よりも処理が軽い。 しかし、値も必要であれば、get の戻り値をnull としてチェックするだけでよく、

// 良い使い方
if ("MY_ENV_FLAG" in environment)
    doSomething();

// 悪い使い方
if ("MY_ENV_VAR" in environment)
    doSomething(environment["MY_ENV_VAR"]);

// 代わりにこうする
if (auto var = environment.get("MY_ENV_VAR"))
    doSomething(var);

static @trusted string[string] toAA();
すべての環境変数を連想配列にコピーする。

Windows 固有 Windows の環境変数名は大文字と小文字を区別しないが、Dの 組み込み連想配列は区別する。この関数は、すべての 変数名を大文字で保存する(例:PATH )。

Throws:
Exception環境変数を取得できなかった場合 (Windows のみ)に
nothrow @nogc @property @trusted int thisProcessID();
現在のプロセスのプロセスIDを返す。 これはシステム上で一意であることが保証されている。

writefln("Current process ID: %d", thisProcessID);

nothrow @nogc @property @trusted ThreadID thisThreadID();
現在のスレッドのプロセス ID を返します。 これは、現在のプロセス内で一意であることが保証されています。
Returns:
core.thread.ThreadID呼び出しスレッドの値。

writefln("Current thread ID: %s", thisThreadID);

@safe Pid spawnProcess(scope const(char[])[] args, File stdin = std.stdio.stdin, File stdout = std.stdio.stdout, File stderr = std.stdio.stderr, const string[string] env = null, Config config = Config.none, scope const char[] workDir = null);

@trusted Pid spawnProcess(scope const(char[])[] args, const string[string] env, Config config = Config.none, scope const(char)[] workDir = null);

@trusted Pid spawnProcess(scope const(char)[] program, File stdin = std.stdio.stdin, File stdout = std.stdio.stdout, File stderr = std.stdio.stderr, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null);

@trusted Pid spawnProcess(scope const(char)[] program, const string[string] env, Config config = Config.none, scope const(char)[] workDir = null);
新しいプロセスを生成し、任意で標準入力、標準出力、エラーストリームの任意のセットを割り当てる。
この関数は直ちに終了し、子プロセスは 親プロセスと並行して実行される。 常に wait 返されたものに対して PidプロセスがConfig.detached フラグで生成された場合を除き、wait のドキュメントで詳細に説明されているように、

コマンドライン この関数には4つのオーバーロードがある。最初の2つは、 文字列の配列を引数にとり、 args、その配列には、 ゼロ番目の要素としてプログラム名、それ以降の要素にコマンドライン引数を指定する。 3番目と4番目のバージョンは便宜上含まれているもので、 コマンドライン引数がない場合に利用できる。これらのバージョンでは、単一の文字列を指定するprogramプログラム名を指定する。

ディレクトリが指定されていない場合、 args[0]または、 programspawnProcessプラットフォームに依存した方法でプログラムを検索します。 POSIXシステムでは、実行可能ファイルを 環境変数PATHにリストされたディレクトリで、リストされた順に 検索します。 Windowsでは、実行可能ファイルを 以下の順序で検索します。
  1. アプリケーションがロードされたディレクトリ。
  2. 親プロセスのカレントディレクトリ。
  3. 32ビットのWindowsシステムディレクトリ。
  4. 16ビットのWindowsシステムディレクトリ。
  5. Windowsディレクトリ。
  6. PATH環境変数にリストされているディレクトリ。
// 現在の作業ディレクトリにある"prog"という実行ファイルを
// 実行する:
auto pid = spawnProcess("./prog");
scope(exit) wait(pid);
// プログラムが実行されている間、他のことができる。スコープガードは、
// スコープの終わりでプロセスが待機することを保証する。
...

// コンパイラスイッチをいくつか指定して、ファイル"myprog.d"に対してDMDを実行する:
auto dmdPid = spawnProcess(["dmd", "-O", "-release", "-inline", "myprog.d" ]);
if (wait(dmdPid) != 0)
    writeln("Compilation failed!");

環境変数 デフォルトでは、子プロセスは親プロセスの環境を継承する。 パラメータで指定された追加の変数も同様である。 env 。親の環境と子プロセス環境の両方に同じ変数が存在する場合、 env後者が優先されます。

もし Config.newEnvフラグが設定されている場合、 config、子 プロセス親の環境を継承しません。その環境は、 すべて によって決定されます。 env
wait(spawnProcess("myapp", ["foo" : "bar"], Config.newEnv));
標準ストリーム オプション引数

標準ストリーム オプション引数 stdinstdoutおよび stderr任意のオブジェクトを それぞれ、子プロセスの標準 std.stdio.Fileオブジェクトをそれぞれ子プロセスの標準 入力、標準出力、標準エラー出力に割り当てることができる。 前者は読み込み用にオープンされ、後者2つは書き込み用にオープンされなければならない。 デフォルトでは、子プロセスは親の標準入出力を継承する。

// myprog.dファイルに対してDMDを実行し、エラーメッセージをすべて
//  errors.logというファイルに記録する。
auto logFile = File("errors.log", "w");
auto pid = spawnProcess(["dmd", "myprog.d"],
                        std.stdio.stdin,
                        std.stdio.stdout,
                        logFile);
if (wait(pid) != 0)
    writeln("Compilation failed. See errors.log for details.");
File オブジェクトを渡す場合、それが 親プロセスの標準入出力/エラーストリームのいずれでもない場合、 そのストリームデフォルトで、この関数が返却される際に親プロセスで閉じられるConfigこの動作を無効にする方法については、 以下のドキュメントを参照のこと。
File オブジェクトを渡す際には、バッファリングの問題に注意することspawnProcess。 子プロセスは、 基礎となるファイル記述子に関連付けられた低レベルの生の読み書きオフセットを継承するが、 バッファリングされたデータについては認識しない。 この問題が重要となる場合 (例えば、子プロセスに渡す前にファイルを整列させる必要がある場合など )には、バッファリングされていないストリームを使用するか、少なくとも 関連するすべてのバッファを確実にフラッシュすることが望ましい。

Parameters:
const(char[])[] args プログラム名をゼロ番目の要素として含み、 コマンドライン引数をその後の要素に含む配列。
File stdin 子プロセスの標準入力ストリーム。 これは、 std.stdio.File読み込み用にオープンされているものなら何でもよい。 デフォルトでは、子プロセスは親の入力ストリームを継承する 。
File stdout 子プロセスの標準出力ストリーム。 これは、 std.stdio.File書き込み用にオープンされているものなら何でもよい。 デフォルトでは、子プロセスは親の出力ストリームを継承する。
File stderr 子プロセスの標準エラーストリーム。 これは、 std.stdio.File書き込み用にオープンされているもの。 デフォルトでは、子プロセスは親のエラーストリームを継承する。
string[string] env 子プロセス用の追加環境変数。
Config config プロセスの作成を制御するフラグ。 Config 利用可能なフラグの概要については、
char[] workDir 新しいプロセスの作業ディレクトリ。 デフォルトでは、子プロセスは親の作業ディレクトリを継承する。
Returns: A
A Pid生成されたプロセスに対応するオブジェクト。
Throws:
ProcessExceptionプロセスが起動できなかった場合。
std.stdio.StdioExceptionストリームのいずれかを子プロセスに渡す ことに失敗した場合(Windows のみ)。
core.exception.RangeErrorargsが空の場合。
@trusted Pid spawnShell(scope const(char)[] command, File stdin = std.stdio.stdin, File stdout = std.stdio.stdout, File stderr = std.stdio.stderr, scope const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null, scope string shellPath = nativeShell);

@trusted Pid spawnShell(scope const(char)[] command, scope const string[string] env, Config config = Config.none, scope const(char)[] workDir = null, scope string shellPath = nativeShell);
そのバリエーションは、 spawnProcess現在のユーザーが好むコマンドインタープリタ(別名シェル)を介して 指定のコマンドを実行する。
文字列は commandそのままシェルに渡されるため、 コマンド構造、引数/ファイル名の引用、 特殊文字のエスケープに関する シェルの規則に従う。シェル実行ファイルへのパスはデフォルトで nativeShell
その他の点では、この関数はspawnProcess と同様に動作する。 spawnProcess他の関数パラメータ、戻り値、 スローされる可能性のある例外に関する説明については、 ドキュメントを参照のこと。 function関数
// "my file.txt"という名前のファイルに対してコマンド/プログラム"foo"を実行し、
// その出力をfoo.logにリダイレクトする。
auto pid = spawnShell(`foo "my file.txt" > foo.log`);
wait(pid);
other respectその他
See Also: 、これは現在のプラットフォームで適切に引用符とエスケープ処理されたシェルコマンドラインを構築する際に役立つ可能性がある。
escapeShellCommand、これは 現在のプラットフォームで適切に引用符とエスケープ文字を付けたシェルコマンドラインを構築する際に役立つ可能性がある。
struct Config;
このモジュール内のプロセス作成関数の動作を制御するオプション。 ほとんどのオプションは、 spawnProcessspawnShell

auto logFile = File("myapp_error.log", "w");

// コンソールウィンドウを抑制してプログラムを起動し(Windowsのみ)、
// そのエラーストリームをlogFileにリダイレクトし、
// 親プロセスでもlogFileを開いたままにする。
auto pid = spawnProcess("myapp", stdin, stdout, logFile,
                        Config.retainStderr | Config.suppressConsole);
scope(exit)
{
    auto exitCode = wait(pid);
    logFile.writeln("myapp exited with code ", exitCode);
    logFile.close();
}
フラグオプション。 フラグを組み合わせるには、ビット単位のOR演算を使用する。

enum Flags: int;

Flags flags;
フラグオプション。 フラグを組み合わせるには、ビット単位のORを使用する。
newEnv
デフォルトでは、子プロセスは親の環境を継承し、 任意の環境変数が渡されると、 spawnProcessそれに追加されます。このフラグが設定されている場合、 子プロセスの環境変数は spawnProcess に渡されたものだけになります。
retainStdin

retainStdout

retainStderr
子プロセスが親の標準入出力エラーストリームを継承しない限り、 ストリームは閉じられることがほとんどである。 spawnProcess。したがって、 デフォルトでは、これが実行される。これが望ましくない場合は、これらのオプションのいずれかを spawnProcessに渡す。
suppressConsole
Windows では、子プロセスがコンソールアプリケーションの場合、この フラグはコンソールウィンドウの作成を防止する。 それ以外の場合、 このフラグは無視される。 POSIX では、 suppressConsole効果はありません。
inheritFDs
POSIXでは、オープンされたファイル記述子は デフォルトで子プロセスに継承される。これは、 パイプや複数のスレッドが関与している場合に微妙なバグにつながる可能性があるため、 spawnProcess標準入出力/エラーに対応するものを除き、 子プロセスが開始する際にすべてのファイル記述子が閉じられるようにする。 inheritFDsこれを防ぐには 。
Windowsでは、このオプションは効果がない。また、 明示的に継承可能としてマークされたハンドルは、常に子プロセスに継承される。
detached
プロセスを分離状態で起動する。これにより、 waitプロセスリソースのクリーンアップを呼び出す必要がなくなります。

注釈 呼び出し waitまたは kill結果として得られるPid は無効です。

stderrPassThrough
デフォルトでは、 executeおよび executeShell関数は 子プロセスの標準出力と標準エラー出力の両方を取得する。 これは、標準出力を呼び出しプログラムで処理または使用する場合には望ましくない場合がある。execute の結果には 出力と警告/エラーメッセージが混在することになるからだ。
execute またはexecuteShell を呼び出す際にこのフラグを指定すると、 呼び出されたプロセスの標準エラー出力ストリームが送信され、 std.stdio.stderr、標準出力をキャプチャして返すようにします。
このフラグは、 spawnProcessspawnShell
enum Config none;

enum Config newEnv;

enum Config retainStdin;

enum Config retainStdout;

enum Config retainStderr;

enum Config suppressConsole;

enum Config inheritFDs;

enum Config detached;

enum Config stderrPassThrough;

Config opUnary(string op)()
if (is(typeof(mixin(op ~ "flags"))));

Config opBinary(string op)(Config other)
if (is(typeof(mixin("flags" ~ op ~ "other.flags"))));

Config opOpAssign(string op)(Config other)
if (is(typeof(mixin("flags" ~ op ~ "=other.flags"))));
後方互換性のため、およびフラグのみを指定する必要がある場合 (Config )には、これらのフラグを使用することで、フラグ名のみでConfig インスタンスを構築することができる。
bool function() nothrow @nogc @safe preExecFunction;
exec の前に呼び出される関数で、 spawnProcess。 成功した場合はtrue を返し、失敗した場合はfalse を返す。
警告: この関数のコードでは、async-signal-safe関数のみを使用しなければならないことに注意すること
If preExecDelegateも設定されている場合、最後に呼び出されます。
Windowsでは、このメンバーは利用できません。
bool delegate() nothrow @nogc @safe preExecDelegate;
exec の前に呼び出されるデリゲート。 spawnProcess。 成功した場合はtrue を返し、失敗した場合はfalse を返す。
警告: この関数のコードでは、async-signal-safe関数のみを使用しなければならないことに注意すること
If preExecFunctionも設定されている場合、最初に呼び出されます。
Windowsでは、このメンバーは利用できません。
class Pid;
生成されたプロセスに対応するハンドル。
const pure nothrow @property @safe int processID();
プロセスID番号。
これは、オペレーティングシステム上でプロセスを一意に識別する番号であり、 少なくともプロセスが実行されている間は有効である。 wait 一度呼び出された Pid、このメソッドは無効な(負の)プロセスIDを返します。
pure nothrow @nogc @property @safe pid_t osHandle();
プロセスに対するオペレーティングシステムのハンドル。
このハンドルは、OS固有のAPIでプロセスを指定するために使用される。 POSIXでは、この関数はcore.sys.posix.sys.types.pid_tを返す。 Pid.processID。一方、Windowsでは core.sys.windows.windows.HANDLE を返す。
一度 waitが呼び出された場合、 Pid、このメソッドは 無効なハンドルを返します。
@safe int wait(Pid pid);
に関連付けられたプロセスの終了を待ち、 pid終了するのを待ち、 その終了ステータスを返す。
一般的に、子プロセスが終了するまで 親プロセスを終了してはならない。ただし、プロセスが非同期で生成された (Config.detached フラグで生成された)場合はこの限りではない。 そうでない場合、プロセスは「ゾンビ」になる可能性がある。 ゾンビプロセスとは、すでに終了しているにもかかわらず、OSのプロセステーブルのスロットを占有しているプロセスである。 非同期プロセスは所有できないため、待機してはならない。
プロセスがすでに終了している場合は、この関数は直接終了する。 終了コードはキャッシュされるため、同じプロセスに対して wait() が複数回呼び出された場合でも Pid常に同じ値を返します。

POSIX 固有 プロセスがシグナルによって終了した場合、この関数は その絶対値がシグナル番号である負の数を返す。 POSIX では通常の終了コードの範囲を 0 ~ 255 に制限しているため、 負の値が返された場合は常にシグナルによる終了であることを示す。 シグナルコードはcore.sys.posix.signal モジュールで定義されている (これはsignal.h POSIX ヘッダーに対応する)。

Throws:
ProcessException失敗した場合、または分離されたプロセスを待機しようとした場合。

例 参照 spawnProcessドキュメントを参照。

See Also:
tryWait、非ブロッキング関数については
@safe Tuple!(bool, "terminated", int, "status") waitTimeout(Pid pid, Duration timeout);
関連付けられたプロセスが終了するか、 pid終了するか、 経過時間が指定のタイムアウトを超えるまで待機します。
プロセスが指定時間内に終了した場合、その動作はwait とまったく同じだが、タプル(true, exit code) を返す点が異なる。
プロセスが指定時間内に終了しなかった場合、待ちを中止して(false, 0).を返す。
タイムアウトは(uint.max - 1).msecs (約7週間17時間)を超えない。
この関数はWindows専用である。 "function"関数
Returns:
std.typecons.Tuple!(bool, "terminated", int, "status")
Throws:
ProcessException失敗した場合、または分離されたプロセスを待機しようとした場合。

例 ドキュメントを参照。 spawnProcessドキュメントを参照。

See Also: 、タイムアウトなしのブロック関数については
wait、タイムアウトなしのブロック関数についてはtryWaitタイムアウトなしの非ブロッキング関数については、
@safe auto tryWait(Pid pid);
非ブロッキング版の wait
に関連付けられたプロセスが pidすでに終了している場合、tryWaitwait とまったく同じ効果がある。 この場合、terminated フィールドがtrue に設定され、status フィールドはwait の戻り値と同じ解釈となる。
プロセスがまだ終了していない場合、この関数はwait とは異なり、終了を待たずに 即座に返す。返されたタプルのterminated フィールドはfalse に設定され、status フィールドは 常に0(ゼロ)となる。wait または を tryWaitその後、 同じPid に対して、後日、再度呼び出す必要がある。 終了コードを取得するためだけでなく、プロセスが最終的に終了した際に「ゾンビ」プロセスにならないようにするためでもある。 (詳細は wait詳細)。
Returns: xml-ph-0000@deepl.internal 。
std.typecons.Tuple!(bool, "terminated", int, "status")
Throws: 失敗した場合、または分離プロセスを待機しようとした場合。
ProcessException失敗した場合、または分離プロセスを待機しようとした場合。

auto pid = spawnProcess("dmd myapp.d");
scope(exit) wait(pid);
...
auto dmd = tryWait(pid);
if (dmd.terminated)
{
    if (dmd.status == 0) writeln("Compilation succeeded!");
    else writeln("Compilation failed");
}
else writeln("Still compiling...");
...
この例では、最初のwait の呼び出しは、 呼び出された時点でプロセスがすでに終了している場合は何の効果もない。 tryWait 。しかし、その逆の場合は、scope 文により、 スコープの終了時にプロセスが終了していなければ、常にプロセスを待つことができる。

void kill(Pid pid);

void kill(Pid pid, int codeOrSignal);
プロセスを終了しようとする。 pid
この関数の効果、および codeOrSignalプラットフォームに大きく依存する。詳細は以下を参照のこと。 すべてのプラットフォームに共通するのは、この関数はプロセスの終了処理を開始するだけで、 すぐに戻ることである。プロセスが終了するのを待つことはなく、 プロセスが実際に終了することを保証するものでもない。
プロセスが完了するのを待つには、常に waitプロセスが完了するまで待つために、 kill そのプロセスが呼び出された場合でも、

Windows 特有 プロセスは 強制的に、突然終了するcodeOrSignal指定する場合は、 プロセスの終了コードとして使用される非負の数値でなければなりません。 指定しない場合は、プロセスはコード1で終了します。codeOrSignal = 259 は使用しないでください。 これは特別な値(STILL_ACTIVE)であり、 プロセス実際にはまだ終了していないことを示すためにWindowsで使用されます。

auto pid = spawnProcess("some_app");
kill(pid, 10);
assert(wait(pid) == 10);

POSIX 固有 シグナルがプロセスに送信される。その値は codeOrSignal。 送信されたシグナルに応じて、プロセスが終了する場合としない場合がある。 さまざまなPOSIX シグナルのシンボル定数は、core.sys.posix.signal で定義されており、これはsignal.h POSIX ヘッダーに対応する。 codeOrSignal省略された場合、SIGTERM 信号が送信されます。(これは_killシェルコマンドの動作と一致する。

import core.sys.posix.signal : SIGKILL;
auto pid = spawnProcess("some_app");
kill(pid, SIGKILL);
assert(wait(pid) == -SIGKILL); // POSIXでは負の値を返す!

Throws: エラー発生時(例えば、codeOrSignalが無効な場合)、またはデタッチされたプロセスの終了を試みた場合。 プロセスの終了に失敗しても、それは「正常」な結果であり、エラーではないことに注意。
ProcessExceptionエラー発生時(例えば、codeOrSignal が無効な場合)、 またはデタッチされたプロセスの終了を試みた場合。 プロセスを終了できなかった場合でも、それは「正常」な結果であり、エラーではないことに 注意。
@trusted Pipe pipe();
一方向パイプを作成する。
データはパイプの一方の端に書き込まれ、もう一方の端から読み込まれる。
auto p = pipe();
p.writeEnd.writeln("Hello World");
p.writeEnd.flush();
assert(p.readEnd.readln().chomp() == "Hello World");
パイプは、例えば、 新しいプロセスを生成し、パイプの一方の端を子プロセスに渡すことで プロセス間通信に使用できる。一方、親プロセスはもう一方の端を使用する。 (「 pipeProcesspipeShellより簡単な 方法については to see also参照
// cURLを使用して dlang.orgのフロントページをダウンロードし、
// その出力をgrepにパイプして ZIPファイルへのリンクの一覧を抽出し、
// その一覧をファイル"D downloads.txt"に書き込む:
auto p = pipe();
auto outFile = File("D downloads.txt", "w");
auto cpid = spawnProcess(["curl", "http://dlang.org/download.html"],
                         std.stdio.stdin, p.writeEnd);
scope(exit) wait(cpid);
auto gpid = spawnProcess(["grep", "-o", `http://\S*\.zip`],
                         p.readEnd, outFile);
scope(exit) wait(gpid);
to use行う
Returns:
Pipe作成されたパイプに対応するオブジェクト。
Throws: エラー時に
std.stdio.StdioExceptionエラー時に。
struct Pipe;
関数によって作成されたパイプへのインターフェイス。 pipe
nothrow @property @safe File readEnd();
パイプの読み込み側。
nothrow @property @safe File writeEnd();
パイプの書き込み側。
@safe void close();
パイプの両端を閉じる。
通常、手動でこれを行う必要はありません。 std.stdio.File オブジェクトへの参照がなくなると自動的に閉じられるため、
パイプのどちらかの端が子プロセスに渡された場合、 親プロセスでのみ閉じられることに注意。(子プロセスで何が起こるかは プラットフォームに依存する。)
Throws:
std.exception.ErrnoExceptionエラーが発生した場合。
@safe ProcessPipes pipeProcess(scope const(char[])[] args, Redirect redirect = Redirect.all, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null);

@safe ProcessPipes pipeProcess(scope const(char)[] program, Redirect redirect = Redirect.all, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null);

@safe ProcessPipes pipeShell(scope const(char)[] command, Redirect redirect = Redirect.all, const string[string] env = null, Config config = Config.none, scope const(char)[] workDir = null, string shellPath = nativeShell);
新しいプロセスを開始し、その標準 入力、出力、および/またはエラーストリームをリダイレクトするパイプを作成する
pipeProcesspipeShellは便利なラッパーであるspawnProcess、それぞれに便利なラッパーであり、 spawnShellそれぞれ、 子プロセスの標準ストリームをパイプ経由でリダイレクトする作業を自動化する。 これらの関数は、ラップする関数と同様に、 子プロセスを呼び出し元のプロセスと並行して実行したままにして、すぐに終了する。 常に wait返されたものに対して ProcessPipes.pidwait のドキュメントに詳細が記載されている。
The args/program/commandenvconfig パラメータは、基礎となるスプール関数にそのまま転送され、 詳細はそれぞれのドキュメントを参照してほしい。
Parameters:
const(char[])[] args プログラム名をゼロ番目の要素として含み、 コマンドライン引数をその後の要素に含む配列。 (詳細は spawnProcess詳細は
const(char)[] program コマンドライン引数を含まないプログラム名。 (詳細は spawnProcess詳細は
const(char)[] command コマンドインタープリタにそのまま渡されるシェルコマンド 。(詳細は spawnShell詳細は
Redirect redirect どのストリームがどのようにリダイレクトされるかを決定するフラグ。 利用可能なフラグの概要については Redirect利用可能なフラグの概要については 参照のこと。
string[string] env 子プロセス用の追加環境変数。 (詳細は spawnProcess詳細は
Config config プロセス生成を制御するフラグ。 Config 利用可能なフラグの概要についてはを参照し、retainStd... フラグは本関数では効果がないことに注意すること。
const(char)[] workDir 新しいプロセスの作業ディレクトリ。 デフォルトでは、子プロセスは親の作業ディレクトリを継承する。
string shellPath 指定したプログラムを実行する際に使用するシェルへのパス。 デフォルトでは、これは nativeShell
Returns:
A ProcessPipesオブジェクトで、 std.stdio.File 子プロセスのリダイレクトされたストリームと通信するハンドルを 含み、 Pid生成されたプロセスに対応する オブジェクト。
Throws:
ProcessExceptionプロセスが開始できなかった場合。
std.stdio.StdioExceptionストリームのリダイレクトに失敗した場合。

// my_applicationは標準出力に書き込み、標準エラー標準出力に書き込むかもしれない
auto pipes = pipeProcess("my_application", Redirect.stdout | Redirect.stderr);
scope(exit) wait(pipes.pid);

// 出力の行を保存する。
string[] output;
foreach (line; pipes.stdout.byLine) output ~= line.idup;

// エラーの行を保存する。
string[] errors;
foreach (line; pipes.stderr.byLine) errors ~= line.idup;


// sendmailは標準入力からの読み込みを期待する
pipes = pipeProcess(["/usr/bin/sendmail", "-t"], Redirect.stdin);
pipes.stdin.writeln("To: you");
pipes.stdin.writeln("From: me");
pipes.stdin.writeln("Subject: dlang");
pipes.stdin.writeln("");
pipes.stdin.writeln(message);

// ピリオドひとつで、sendmailに終了を告げる
pipes.stdin.writeln(".");

// が、この時点ではsendmailはそれを見ないかもしれない。sendmailが
pipes.stdin.flush();

// "."で終了してしまう場合は、フラッシュする必要があるが、ファイルを閉じる必要があるものもある:
pipes.stdin.close();

// そうしないと、この待ち時間は永遠に続くことになる
wait(pipes.pid);

enum Redirect: int;
渡すことができるフラグ pipeProcesspipeShell 子プロセスの標準ストリームのどれがリダイレクトされるかを指定する。 フラグを組み合わせるにはビット単位のORを使用する。
stdin

stdout

stderr
標準入力、標準出力、標準エラー出力をそれぞれリダイレクトする。
all
3つのストリームすべてをリダイレクトする。これはRedirect.stdin | Redirect.stdout | Redirect.stderr と同等である。
stderrToStdout
標準エラーストリームを標準出力ストリームにリダイレクトする。 これは、Redirect.stderr と組み合わせることはできない。
stdoutToStderr
標準出力ストリームを標準エラーストリームにリダイレクトする。 これはRedirect.stdout と組み合わせることはできない。
struct ProcessPipes;
オブジェクトは、 std.stdio.File子プロセスとの標準ストリームを介した通信を 可能にするハンドルを含む
nothrow @property @safe Pid pid();
Pid子プロセスの
nothrow @property @safe File stdin();
std.stdio.File子プロセスの標準入力ストリームへの書き込みを許可する。
Throws:
Error子プロセスの標準入力ストリームが リダイレクトされていない場合。
nothrow @property @safe File stdout();
子プロセスの標準出力ストリームからの読み込みを許可する 。 std.stdio.File子プロセスの標準出力ストリームからの読み込みを許可する。
Throws: 子プロセスの標準出力ストリームが リダイレクトされていない場合。
Error子プロセスの標準出力ストリームが リダイレクトされていない場合。
nothrow @property @safe File stderr();
std.stdio.File子プロセスの標準エラーストリームからの読み込みを許可する。
Throws: 子プロセスの標準エラー出力がリダイレクトされていない場合。
Error子プロセスの標準エラー出力が リダイレクトされていない場合。
@safe auto execute(scope const(char[])[] args, const string[string] env = null, Config config = Config.none, size_t maxOutput = size_t.max, scope const(char)[] workDir = null);

@safe auto execute(scope const(char)[] program, const string[string] env = null, Config config = Config.none, size_t maxOutput = size_t.max, scope const(char)[] workDir = null);

@safe auto executeShell(scope const(char)[] command, const string[string] env = null, Config config = Config.none, size_t maxOutput = size_t.max, scope const(char)[] workDir = null, string shellPath = nativeShell);
指定されたプログラムまたはシェルコマンドを実行し、その終了 コードと出力を返す。
executeexecuteShell新しいプロセスを開始するspawnProcessspawnShell、それぞれを実行し、 プロセスが完了するまで待ってから終了する。この関数は、 子プロセスが標準出力と標準エラーストリームの両方に書き込んだ内容を取得し、 終了コードとともにこれを返す。
auto dmd = execute(["dmd", "myapp.d"]);
if (dmd.status != 0) writeln("Compilation failed:\n", dmd.output);

auto ls = executeShell("ls -l");
if (ls.status != 0) writeln("Failed to retrieve file listing");
else writeln(ls.output);
その args/program/commandenvパラメータは、 config パラメータは、直接、下層の生成関数に転送され、 詳細はそれぞれのドキュメントを参照すること。
Parameters:
const(char[])[] args プログラム名をゼロ番目の要素として含み、 コマンドライン引数をその後の要素に含む配列。 (詳細は spawnProcess詳細は
const(char)[] program コマンドライン引数を含まないプログラム名。 (詳細は spawnProcess詳細は
const(char)[] command コマンドインタープリタにそのまま渡されるシェルコマンド 。(詳細は spawnShell詳細は
string[string] env 子プロセス用の追加環境変数。 (詳細は spawnProcess詳細は
Config config プロセスの作成を制御するフラグ。 Config 利用可能なフラグの概要についてはを参照し、retainStd... フラグは、この関数では効果がないことに注意すること。
size_t maxOutput 取得すべき出力の最大バイト数 。
const(char)[] workDir 新しいプロセスの作業ディレクトリ。 デフォルトでは、子プロセスは親の作業ディレクトリを継承する。
string shellPath 指定したプログラムを実行する際に使用するシェルのパス。 デフォルトでは、これは nativeShell
Returns: xml-ph-0000@deepl.internal である。
std.typecons.Tuple!(int, "status", string, "output")

POSIX 固有 プロセスがシグナルによって終了した場合、戻り値のstatus フィールドには 絶対値がシグナル番号である負の数値が格納される。 (詳細は wait詳細については

Throws:
ProcessExceptionプロセスを開始できなかった場合。
std.stdio.StdioException出力のキャプチャに失敗した場合。
class ProcessException: object.Exception;
プロセスを開始または待機する際に問題が発生したことを示す例外。
@property @safe string userShell();
現在のユーザーが好むコマンドインタープリターへのパスを決定する。
Windowsでは、この関数は、COMSPEC環境変数が存在する場合、その内容を返す。 存在しない場合は、の実行結果を返す。 nativeShell
POSIXでは、 userShellSHELL 環境変数の内容が存在し、空ではない場合に、その内容を返す。 それ以外の場合、nativeShell
pure nothrow @nogc @property @safe string nativeShell();
プラットフォーム固有のネイティブシェルパス。
この関数は、Windowsでは"cmd.exe" 、POSIXでは"/bin/sh" 、 Androidでは"/system/bin/sh" を返す。
pure @safe string escapeShellCommand(scope const(char[])[] args...);
argv形式の引数配列をエスケープして、 spawnShellpipeShellまたは executeShell
string url = "http://dlang.org/";
executeShell(escapeShellCommand("wget", url, "-O", "dlang-index.html"));
複数の escapeShellCommandし、 シェルリダイレクトまたはパイプ演算子を使用して結果を結合する。escapeShellFileNameシェルリダイレクトまたはパイプ演算子を使用する。
executeShell(
    escapeShellCommand("curl", "http://dlang.org/download.html") ~
    "|" ~
    escapeShellCommand("grep", "-o", `http://\S*\.zip`) ~
    ">" ~
    escapeShellFileName("D download links.txt"));
concatenateconcatenate
Throws:
Exceptionコマンドラインの一部にエスケープ不可能な文字が含まれている場合 (すべてのプラットフォームにおけるNUL、およびWindowsにおけるCRとLF)。
pure nothrow @trusted string escapeWindowsArgument(scope const(char)[] arg);
CommandLineToArgvWの動作に準拠した方法でコマンドライン引数を引用する。
pure nothrow @trusted string escapeShellFileName(scope const(char)[] fileName);
シェルリダイレクションで使用されるファイル名をエスケープする。 spawnShellpipeShellまたは executeShell
int execv(in string pathname, in string[] argv);

int execve(in string pathname, in string[] argv, in string[] envp);

int execvp(in string pathname, in string[] argv);

int execvpe(in string pathname, in string[] argv, in string[] envp);
コマンドを実行して現在のプロセスを置き換える。 pathname、 引数とともに argv
この関数は、Posix専用である。
通常、の最初の要素は、 argvは 実行されるコマンド、すなわちargv[0] == pathname である。 'p' バージョンのexec は、 pathname を検索するために環境変数 PATH を参照する。 'e' バージョンはさらに、新しいプロセスの 環境変数を、key=value の形式の文字列の配列として取得する。
は、成功しても戻り値を返さない(現在のプロセスが置き換えられる)。 失敗した場合は -1 を返し、

Windows 固有 これらの関数は、POSIX プラットフォームでのみサポートされている。Windows オペレーティングシステムでは、現在のプロセスイメージを別のプロセスイメージで上書きする機能が提供されていないためである。シングルスレッドのプログラムでは、 execv*spawnProcess 子プロセスが戻ってきた時点で現在のプロセスを終了させることで、 例えば:

auto commandLine = [ "program", "arg1", "arg2" ];
version (Posix)
{
    execv(commandLine[0], commandLine);
    throw new Exception("Failed to execute program");
}
else version (Windows)
{
    import core.stdc.stdlib : _Exit;
    _Exit(wait(spawnProcess(commandLine)));
}
しかし、これは POSIX のものと同等ではない execv*。 ひとつには、 実行プログラムは別のプロセスとして開始され、それにはすべてが伴う。 2つ目に、マルチスレッドプログラムでは、現在のスレッドが子プロセスの完了を待っている間、他のスレッドは 作業を継続する。
子プロセスを生成した後に現在のプログラムを即座に終了する方が良い場合もある。 これは、 __exec Microsoft の C ランタイムライブラリの関数で示される動作であり、D の現在非推奨となっている Windows execv*関数も同様に動作する。 例:
auto commandLine = [ "program", "arg1", "arg2" ];
version (Posix)
{
    execv(commandLine[0], commandLine);
    throw new Exception("Failed to execute program");
}
else version (Windows)
{
    spawnProcess(commandLine);
    import core.stdc.stdlib : _exit;
    _exit(0);
}

void browse(scope const(char)[] url);
ブラウザを起動し、URLのページを表示するように設定する。