std.process
プロセス処理
- 新しいプロセスを生成し、任意で標準入力、出力、エラーストリームの任意のセットを割り当てる。この関数は直ちに終了し、子プロセスは親プロセスと並行して実行される。すべての spawnProcess新しいプロセスを生成し、任意で 標準入力、出力、エラーストリームの任意のセットを割り当てる。 この関数は直ちに終了し、子プロセスは 親プロセスと並行して実行される。このモジュール内の他のすべての関数で プロセスを生成するものは、spawnProcess を中心に構築されている。
- 親プロセスが子プロセスが終了するのを待つようにする。一般的に、親プロセスが終了する際に子プロセスが「ゾンビ」にならないように、常にこれを行うべきである。 スコープガードは、この目的に最適である。 wait親プロセスが子プロセスが終了するのを待つようにする。 一般的に、親プロセスが終了した際に子プロセスが「ゾンビ」にならないように、常にこの処理を行うべきである。 スコープガードは、この処理に最適である。 spawnProcess 。 tryWaitはwait と似ているが、 プロセスがまだ終了していない場合はブロックしない。
- また、子プロセスも生成され、親プロセスと並行して実行される。ただし、任意のストリームを取得するのではなく、自動的にパイプのセットを作成し、親プロセスが子プロセスと通信できるようにする pipeProcessまた、子プロセスを生成し、 親プロセスと並行して実行する。ただし、 任意のストリームを取得するのではなく、自動的に パイプのセットを作成し、親プロセスが子プロセスと 子プロセスの標準入力、出力、エラーストリームを通じて 通信できるようにする。この関数は、Cのpopen 関数にほぼ対応する。
- 新しいプロセスを開始し、 それが完了するまで待ってから戻る。さらに、 プロセスの標準出力とエラーストリームを取得し、 それらの出力を文字列として返す。 execute新しいプロセスを開始し、それが 完了するまで待ってから戻る。さらに、 プロセスの標準出力とエラーストリームを取得し、 それらの出力を文字列として返す。
- spawnShell、 pipeShell、 executeShellそれぞれspawnProcess 、pipeProcess 、execute のように動作するが、 ただし、単一のコマンド文字列を受け取り、それを 現在のユーザーのデフォルトのコマンドインタープリターで実行する。executeShell は、Cのsystem 関数にほぼ対応する。
- 実行中のプロセスを終了しようとする。 kill実行中のプロセスを終了しようとする。
プログラムを直接実行する | シェルコマンドを実行する | |
---|---|---|
低レベルのプロセス作成 | spawnProcess | spawnShell |
パイプを使用した自動入出力リダイレクト | pipeProcess | pipeShell |
実行して完了を待ち、出力を収集する | execute | executeShell |
その他の機能
- pipe一方向パイプを作成するために使用される。
- 現在のプロセスの環境変数を読み取り、操作できるインターフェースである。 environmentこれは、現在のプロセスの環境変数を 読み取り、操作するためのインターフェースである。
- 、および escapeShellCommand、 escapeShellFileNameは、 ポータブルな方法でシェルコマンドラインを構築する際に役立つ。
ソースstd/process.d 注 このモジュールの機能のほとんどは、iOS、tvOS、watchOSでは利用できない。 これらのプラットフォームで利用できる機能は次のとおりである。
注釈: このモジュールの機能のほとんどは、iOS、tvOS、watchOSでは利用できない。 これらのプラットフォームで利用できる唯一の関数は、environment、 thisProcessIDおよび 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
, stringdefaultValue
= 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
環境変数に指定されたname
。value
が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
, Filestdin
= std.stdio.stdin
, Filestdout
= std.stdio.stdout
, Filestderr
= std.stdio.stderr
, const string[string]env
= null, Configconfig
= Config.none, scope const char[]workDir
= null);
@trusted PidspawnProcess
(scope const(char[])[]args
, const string[string]env
, Configconfig
= Config.none, scope const(char)[]workDir
= null);
@trusted PidspawnProcess
(scope const(char)[]program
, Filestdin
= std.stdio.stdin
, Filestdout
= std.stdio.stdout
, Filestderr
= std.stdio.stderr
, const string[string]env
= null, Configconfig
= Config.none, scope const(char)[]workDir
= null);
@trusted PidspawnProcess
(scope const(char)[]program
, const string[string]env
, Configconfig
= Config.none, scope const(char)[]workDir
= null); - 新しいプロセスを生成し、任意で標準入力、標準出力、エラーストリームの任意のセットを割り当てる。この関数は直ちに終了し、子プロセスは 親プロセスと並行して実行される。 常に wait 返されたものに対して PidプロセスがConfig.detached フラグで生成された場合を除き、wait のドキュメントで詳細に説明されているように、
コマンドライン この関数には4つのオーバーロードがある。最初の2つは、 文字列の配列を引数にとり、
ディレクトリが指定されていない場合、args
、その配列には、 ゼロ番目の要素としてプログラム名、それ以降の要素にコマンドライン引数を指定する。 3番目と4番目のバージョンは便宜上含まれているもので、 コマンドライン引数がない場合に利用できる。これらのバージョンでは、単一の文字列を指定するprogram
プログラム名を指定する。args
[0]または、program
、spawnProcess
プラットフォームに依存した方法でプログラムを検索します。 POSIXシステムでは、実行可能ファイルを 環境変数PATHにリストされたディレクトリで、リストされた順に 検索します。 Windowsでは、実行可能ファイルを 以下の順序で検索します。- アプリケーションがロードされたディレクトリ。
- 親プロセスのカレントディレクトリ。
- 32ビットのWindowsシステムディレクトリ。
- 16ビットのWindowsシステムディレクトリ。
- Windowsディレクトリ。
- 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!");
環境変数 デフォルトでは、子プロセスは親プロセスの環境を継承する。 パラメータで指定された追加の変数も同様である。
もし Config.newEnvフラグが設定されている場合、env
。親の環境と子プロセス環境の両方に同じ変数が存在する場合、env
後者が優先されます。config
、子 プロセスは親の環境を継承しません。その環境は、 すべて によって決定されます。env
。wait(spawnProcess("myapp", ["foo" : "bar"], Config.newEnv));
標準ストリーム オプション引数標準ストリーム オプション引数
stdin
、stdout
および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: AA Pid生成されたプロセスに対応するオブジェクト。Throws:ProcessExceptionプロセスが起動できなかった場合。
std.stdio.StdioExceptionストリームのいずれかを子プロセスに渡す ことに失敗した場合(Windows のみ)。
core.exception.RangeErrorargs
が空の場合。 - @trusted Pid
spawnShell
(scope const(char)[]command
, Filestdin
= std.stdio.stdin
, Filestdout
= std.stdio.stdout
, Filestderr
= std.stdio.stderr
, scope const string[string]env
= null, Configconfig
= Config.none, scope const(char)[]workDir
= null, scope stringshellPath
= nativeShell);
@trusted PidspawnShell
(scope const(char)[]command
, scope const string[string]env
, Configconfig
= Config.none, scope const(char)[]workDir
= null, scope stringshellPath
= 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
; - このモジュール内のプロセス作成関数の動作を制御するオプション。 ほとんどのオプションは、 spawnProcess。spawnShell。
例
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;
Flagsflags
; - フラグオプション。 フラグを組み合わせるには、ビット単位のORを使用する。
newEnv
- デフォルトでは、子プロセスは親の環境を継承し、 任意の環境変数が渡されると、 spawnProcessそれに追加されます。このフラグが設定されている場合、 子プロセスの環境変数は spawnProcess に渡されたものだけになります。
retainStdin
retainStdout
retainStderr
- 子プロセスが親の標準入出力エラーストリームを継承しない限り、 ストリームは閉じられることがほとんどである。 spawnProcess。したがって、 デフォルトでは、これが実行される。これが望ましくない場合は、これらのオプションのいずれかを spawnProcessに渡す。
suppressConsole
- Windows では、子プロセスがコンソールアプリケーションの場合、この フラグはコンソールウィンドウの作成を防止する。 それ以外の場合、 このフラグは無視される。 POSIX では、
suppressConsole
効果はありません。 inheritFDs
- POSIXでは、オープンされたファイル記述子は デフォルトで子プロセスに継承される。これは、 パイプや複数のスレッドが関与している場合に微妙なバグにつながる可能性があるため、 spawnProcess標準入出力/エラーに対応するものを除き、 子プロセスが開始する際にすべてのファイル記述子が閉じられるようにする。
inheritFDs
これを防ぐには 。Windowsでは、このオプションは効果がない。また、 明示的に継承可能としてマークされたハンドルは、常に子プロセスに継承される。 detached
- プロセスを分離状態で起動する。これにより、 waitプロセスリソースのクリーンアップを呼び出す必要がなくなります。
stderrPassThrough
- デフォルトでは、 executeおよび executeShell関数は 子プロセスの標準出力と標準エラー出力の両方を取得する。 これは、標準出力を呼び出しプログラムで処理または使用する場合には望ましくない場合がある。execute の結果には 出力と警告/エラーメッセージが混在することになるからだ。execute またはexecuteShell を呼び出す際にこのフラグを指定すると、 呼び出されたプロセスの標準エラー出力ストリームが送信され、 std.stdio.stderr、標準出力をキャプチャして返すようにします。 このフラグは、 spawnProcess。 spawnShell。
- enum Config
none
;
enum ConfignewEnv
;
enum ConfigretainStdin
;
enum ConfigretainStdout
;
enum ConfigretainStderr
;
enum ConfigsuppressConsole
;
enum ConfiginheritFDs
;
enum Configdetached
;
enum ConfigstderrPassThrough
;
ConfigopUnary
(string op)()
if (is(typeof(mixin(op ~ "flags"))));
ConfigopBinary
(string op)(Configother
)
if (is(typeof(mixin("flags" ~ op ~ "other
.flags"))));
ConfigopOpAssign
(string op)(Configother
)
if (is(typeof(mixin("flags" ~ op ~ "=other
.flags")))); - 後方互換性のため、およびフラグのみを指定する必要がある場合 (Config )には、これらのフラグを使用することで、フラグ名のみでConfig インスタンスを構築することができる。
- bool function() nothrow @nogc @safe
preExecFunction
; - 警告: この関数のコードでは、async-signal-safe関数のみを使用しなければならないことに注意すること。 If preExecDelegateも設定されている場合、最後に呼び出されます。 Windowsでは、このメンバーは利用できません。
- bool delegate() nothrow @nogc @safe
preExecDelegate
; - 警告: この関数のコードでは、async-signal-safe関数のみを使用しなければならないことに注意すること 。 If preExecFunctionも設定されている場合、最初に呼び出されます。 Windowsでは、このメンバーは利用できません。
- class
Pid
; - 生成されたプロセスに対応するハンドル。
- const pure nothrow @property @safe int
processID
(); - プロセス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
(Pidpid
); - に関連付けられたプロセスの終了を待ち、
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
(Pidpid
, Durationtimeout
); - 関連付けられたプロセスが終了するか、
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ドキュメントを参照。
- @safe auto
tryWait
(Pidpid
); - 非ブロッキング版の wait。に関連付けられたプロセスが
pid
すでに終了している場合、tryWait
wait とまったく同じ効果がある。 この場合、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
(Pidpid
);
voidkill
(Pidpid
, intcodeOrSignal
); - プロセスを終了しようとする。
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");
パイプは、例えば、 新しいプロセスを生成し、パイプの一方の端を子プロセスに渡すことで プロセス間通信に使用できる。一方、親プロセスはもう一方の端を使用する。 (「 pipeProcess、 pipeShellより簡単な 方法については 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
, Redirectredirect
= Redirect.all, const string[string]env
= null, Configconfig
= Config.none, scope const(char)[]workDir
= null);
@safe ProcessPipespipeProcess
(scope const(char)[]program
, Redirectredirect
= Redirect.all, const string[string]env
= null, Configconfig
= Config.none, scope const(char)[]workDir
= null);
@safe ProcessPipespipeShell
(scope const(char)[]command
, Redirectredirect
= Redirect.all, const string[string]env
= null, Configconfig
= Config.none, scope const(char)[]workDir
= null, stringshellPath
= nativeShell); - 新しいプロセスを開始し、その標準 入力、出力、および/またはエラーストリームをリダイレクトするパイプを作成する
pipeProcess
pipeShell
は便利なラッパーであるspawnProcess、それぞれに便利なラッパーであり、 spawnShellそれぞれ、 子プロセスの標準ストリームをパイプ経由でリダイレクトする作業を自動化する。 これらの関数は、ラップする関数と同様に、 子プロセスを呼び出し元のプロセスと並行して実行したままにして、すぐに終了する。 常に wait返されたものに対して ProcessPipes.pid。wait のドキュメントに詳細が記載されている。 Theargs
/program
/command
、env
config
パラメータは、基礎となるスプール関数にそのまま転送され、 詳細はそれぞれのドキュメントを参照してほしい。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:Throws:例
// 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; - 渡すことができるフラグ pipeProcess、 pipeShell 子プロセスの標準ストリームのどれがリダイレクトされるかを指定する。 フラグを組み合わせるにはビット単位の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, Configconfig
= Config.none, size_tmaxOutput
= size_t.max, scope const(char)[]workDir
= null);
@safe autoexecute
(scope const(char)[]program
, const string[string]env
= null, Configconfig
= Config.none, size_tmaxOutput
= size_t.max, scope const(char)[]workDir
= null);
@safe autoexecuteShell
(scope const(char)[]command
, const string[string]env
= null, Configconfig
= Config.none, size_tmaxOutput
= size_t.max, scope const(char)[]workDir
= null, stringshellPath
= nativeShell); - 指定されたプログラムまたはシェルコマンドを実行し、その終了 コードと出力を返す。
execute
、executeShell
新しいプロセスを開始するspawnProcess、 spawnShell、それぞれを実行し、 プロセスが完了するまで待ってから終了する。この関数は、 子プロセスが標準出力と標準エラーストリームの両方に書き込んだ内容を取得し、 終了コードとともにこれを返す。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
/command
、env
パラメータは、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: - class
ProcessException
: object.Exception; - プロセスを開始または待機する際に問題が発生したことを示す例外。
- @property @safe string
userShell
(); - 現在のユーザーが好むコマンドインタープリターへのパスを決定する。Windowsでは、この関数は、COMSPEC環境変数が存在する場合、その内容を返す。 存在しない場合は、の実行結果を返す。 nativeShell。 POSIXでは、
userShell
SHELL 環境変数の内容が存在し、空ではない場合に、その内容を返す。 それ以外の場合、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形式の引数配列をエスケープして、 spawnShell、pipeShellまたは 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"));
concatenateconcatenateThrows:Exceptionコマンドラインの一部にエスケープ不可能な文字が含まれている場合 (すべてのプラットフォームにおけるNUL、およびWindowsにおけるCRとLF)。 - pure nothrow @trusted string
escapeWindowsArgument
(scope const(char)[]arg
); - CommandLineToArgvWの動作に準拠した方法でコマンドライン引数を引用する。
- pure nothrow @trusted string
escapeShellFileName
(scope const(char)[]fileName
); - int
execv
(in stringpathname
, in string[]argv
);
intexecve
(in stringpathname
, in string[]argv
, in string[]envp
);
intexecvp
(in stringpathname
, in string[]argv
);
intexecvpe
(in stringpathname
, 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 の現在非推奨となっている Windowsexecv
*関数も同様に動作する。 例: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のページを表示するように設定する。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku