VCSSL Process ライブラリ は、オペレーティングシステムと通信し、プロセスを起動・制御するための標準ライブラリです。起動したプロセスと、標準入出力でやり取りする事も可能です。
Process ライブラリは、VCSSLからオペレーティングシステムのコマンドを実行したり、別のアプリケーションを起動したりといった機能を提供します。また、VCSSL のプログラムと、VCSSL 以外の言語で開発されたプログラムを連携させる(他言語連携)場合においても必要となります。
VCSSL におけるプロセス制御の基本的な流れは、以下の通りです。
まず、newProcess 関数でプロセスを生成します。この時点では、まだ実行は開始されません。この関数は、プロセスに固有のID(プロセスID)を割り振って返します( ここでのプロセスIDは、VCSSL処理系によって割り振られるIDであり、オペレーティングシステムによって割り振られるIDとは一般に一致しません )。
続いて、startProcess 関数でプロセスの実行を開始します。プロセスの実行は、VCSSLプログラムの実行とは非同期で行われます。つまり、プロセスの再生終了を待つことなく、VCSSL の処理も引き続き実行されていきます。もしも、プロセスの終了までVCSSL側の処理を待機させたい場合は、waitForProcess 関数を使用してください。
プロセスの再生が終了すると、onProcessEnd イベントハンドラがコールされます。ここでプロセスの破棄などを行います。
プロセスの標準出力を取得するには、二通りの方法があります。一つは、getProcessOutput 関数を呼び出し、任意のタイミングで能動的に取得する方法です。これは、プロセスの終了後に、標準出力内容を一括して取得したい場合などに便利です。もう一つは、onProcessOutputイベントハンドラを用いて受動的に取得する方法です。こちらは、受け取った標準出力内容に応じて、標準入力にレスポンスを返したいような場合に便利です。ただしこの場合、標準出力内容が(恐らく行単位で)バッファされ、イベントハンドラに渡されるまでにタイムラグが生じる事に注意してください(特に、改行が行われないままプロセスが入力待ちとなるような場合には注意が必要です)。このタイムラグが問題になるようなやり取りを行うには、必要に応じてループなどからflushProcessOutput 関数をコールし、適時バッファをフラッシュするなどしてください。なお、標準出力やエラーメッセージが文字化けする場合は、setProcessOutputEncoding や setProcessErrorEncoding によって文字コードを設定してください。
生成されるプロセスの作業ディレクトリは、デフォルトでは、VCSSLスクリプトがあるディレクトリ(メインディレクトリ)になります。必要に応じて、setProcessWorkingDirectory を用いて作業ディレクトリを設定できます。自動的にプロセスの実行ファイルの場所には設定されない事に注意してください。なお、プロセスの作業ディレクトリは、環境によっては、必ずしも期待通りに設定されるとは限りません(デフォルト設定のディレクトリについても同様です)。例えば、古典的なシェル/コマンドライン端末上で、カレントディレクトリに設定できない特殊なパスは、作業ディレクトリとしての割り当てに失敗する可能性があります。失敗する既知の具体例としては、「ネットワークドライブとして接続されていない、ネットワーク上のディレクトリを指すUNC形式のパス」などがあります。
作業ディレクトリなどの諸条件を確実に制御し、デバッグもしやすくするには、「実行コマンドをシェルスクリプト等で包んで実行し、そのシェルスクリプト内で作業ディレクトリを設定する」などの方法が有効です。
- なし - None -
- なし - None -
文法的定義 - Signature |
int newProcess( string command[ ] ) |
関数名 - Name |
newProcess |
役割 - Role |
ネイティブアプリケーションのプロセスを生成し、それに固有の識別番号である「プロセスID」を割り振って返します。 この関数によるプロセスの生成後、startProcess をコールするまで実行は開始されないため( VCSSL 3.3以降 )、その間に標準入力内容の設定などを行う事ができます。プロセスの生成は System.exec でも可能ですが、exec はプロセス生成と同時に実行開始も行います。 例として、「test.exe」にコマンドライン引数「1」「2」「3」を指定して起動するには、File ライブラリと Process ライブラリを import した上で: string command[] = { getFilePath("test.exe"), "1", "2", "3" } int processID = newProcess(command); などとします。実行を開始するには、続けて: startProcess(processID); とします。終了まで待機するには、続けて: waitForProcess(processID); とします。 生成されるプロセスの作業ディレクトリは、デフォルトでは、VCSSLスクリプトがあるディレクトリ(メインディレクトリ)に設定されます。必要に応じて、setProcessWorkingDirectory を用いて作業ディレクトリを設定できます。いずれも、特殊なパス形式の場合は設定できない可能性があります。詳細はこのページ冒頭の概要説明を参照してください。 |
引数 - Arguments |
command[] : オペレーティングシステムに渡すコマンド。一般的な環境では [0] に実行ファイル(アプリケーション)の絶対パス、[1] 以降に起動時のコマンドライン引数を指定します。実行ファイルの絶対パスは File.getFilePath を使用して取得できます。なお、環境変数 PATH/Path にパスが登録されている実行ファイルは、絶対パスではなく実行ファイル名のみもで実行できる場合があります(環境依存)。 |
戻り値 - Return |
(int型) 生成したプロセスに割り振られたプロセスID(識別番号)。 |
文法的定義 - Signature |
int newProcess( string command ) |
関数名 - Name |
newProcess |
役割 - Role |
ネイティブアプリケーションのプロセスを生成し、それに固有の識別番号である「プロセスID」を割り振って返します。 基本的には newProcess(string command[]) と同じ機能ですが、引数を配列に区切らなくても、コマンドライン端末のように1行でまとめて記述する事ができます。そのため簡便に使えますが、内容の区切られ方は環境依存/実装依存であるため、異種環境での実行やバージョン変更の際などに、逆にデバッグがややこしい挙動を招く可能性があります。期待通りに動作しない場合や、将来の安定性を重視したい場合は、引数を明示的に配列に区切って渡す newProcess(string command[]) の方の使用が推奨されます。 |
引数 - Arguments |
(string型) command : オペレーティングシステムに渡すコマンド。コマンド入力端末に入力するように、1行にまとめて指定します。ただし環境によっては使用できない場合があります。 |
戻り値 - Return |
(int型) 生成したプロセスに割り振られたプロセスID(識別番号)。 |
文法的定義 - Signature |
void startProcess( int processID ) |
関数名 - Name |
startProcess |
役割 - Role |
ネイティブアプリケーションのプロセスを実行開始します。 実行開始後は、VCSSLの実行とは独立に、非同期に処理が行われます。プロセスの実行完了まで、VCSSL側の処理を待機させたい場合は、waitForProcess をコールしてください。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void deleteProcess( int processID ) |
関数名 - Name |
deleteProcess |
役割 - Role |
ネイティブアプリケーションのプロセスに関するリソースを破棄します。プロセスの実行終了後にコールしてください。 ただし、プロセスの実行途中でコールしてはいけません。プロセスを実行途中で破棄するには先に destroyProcess で強制終了させてください。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void destroyProcess( int processID ) |
関数名 - Name |
destroyProcess |
役割 - Role |
ネイティブアプリケーションのプロセスを、実行途中で強制終了します。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void setProcessInput( int processID, string command ) |
関数名 - Name |
setProcessInput |
役割 - Role |
プロセスに渡す標準入力内容を設定します。 入力内容はバッファされ、プロセスが実際に入力待ちの状態になったタイミングで、プロセスに渡されます。そのためプロセスの終了までに必要な標準入力内容を、改行コード区切りで全てまとめて設定しておく事もできます。 例として、順に「1」,「2」,「3」と入力する場合には: setProcessInput(processID, "1" + EOL + "2" + EOL + "3" + EOL); などとします。 入力内容が文字化けする場合は、setProcessInputEncoding で、プロセスに合った文字コードを設定してください。 なお、バッファに頼らず、標準出力内容の取得と合わせて、対話的に(逐次的に)標準入力を行っていく事もできます。その際、環境にもよりますが、入力内容の末尾には改行コードを付けておかないと、受理されない場合があります。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
string getProcessOutput( int processID ) |
関数名 - Name |
getProcessOutput |
役割 - Role |
コールされた時点までにバッファされている、プロセスの標準出力内容を取得します。 環境によっては、バッファ量に上限があったり、バッファ量が蓄積すると効率が低下する事があります。そのため、標準出力内容が多いネイティブアプリケーションについては、clearProcessOutput で適時バッファをクリアしてください。なお、取得内容が文字化けする場合は、setProcessOutputEncoding で、プロセスに合った文字コードを設定してください。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(string型) プロセスのバッファされている標準出力内容。 |
文法的定義 - Signature |
string getProcessError( int processID ) |
関数名 - Name |
getProcessError |
役割 - Role |
コールされた時点までにバッファされている、プロセスの標準エラー出力内容を取得します。 環境によっては、バッファ量に上限があったり、バッファ量が蓄積すると効率が低下する事があります。そのため、標準エラー出力内容が多いネイティブアプリケーションについては、clearProcessError で適時バッファをクリアしてください。なお、取得内容が文字化けする場合は、setProcessErrorEncoding で、プロセスに合った文字コードを設定してください。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(string型) プロセスのバッファされている標準エラー出力内容。 |
文法的定義 - Signature |
void clearProcessOutput( int processID ) |
関数名 - Name |
clearProcessOutput |
役割 - Role |
プロセスの標準出力バッファをクリアします。標準出力内容が多いネイティブアプリケーションについては、バッファ量が蓄積してくると効率が低下するため、適時クリアしてください。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void clearProcessError( int processID ) |
関数名 - Name |
clearProcessError |
役割 - Role |
プロセスの標準エラー出力バッファをクリアします。標準出力内容が多いネイティブアプリケーションについては、バッファ量が蓄積してくると効率が低下するため、適時クリアしてください。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void flushProcessOutput( int processID ) |
関数名 - Name |
flushProcessOutput |
役割 - Role |
プロセスの標準出力バッファをフラッシュします。フラッシュを行うと、その時点でバッファされている内容が全てonProcessOutput に流されます。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void flushProcessError( int processID ) |
関数名 - Name |
flushProcessError |
役割 - Role |
プロセスの標準エラー出力バッファをフラッシュします。フラッシュを行うと、その時点でバッファされている内容が全てonProcessError に流されます。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void setProcessInputEncoding( int processID, string inputEncoding ) |
関数名 - Name |
setProcessInputEncoding |
役割 - Role |
プロセスに渡す標準入力のテキストエンコーディングを設定します。 この設定は、プロセスの標準入力の使用前に済ませる必要があります。既に何らかの標準入力が行われた後に設定しても、反映されない可能性があります。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 (string型) inputEncoding : 標準入力内容のテキストエンコーディング。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void setProcessOutputEncoding( int processID, string outputEncoding ) |
関数名 - Name |
setProcessOutputEncoding |
役割 - Role |
プロセスの標準出力内容のテキストエンコーディングを設定します。 この設定は、プロセスの標準出力の使用前に済ませる必要があります。既に何らかの標準出力が行われた後に設定しても、反映されない可能性があります。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 (string型) outputEncoding : 標準出力内容のテキストエンコーディング。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void setProcessErrorEncoding( int processID, string errorEncoding ) |
関数名 - Name |
setProcessErrorEncoding |
役割 - Role |
プロセスの標準エラー出力内容のテキストエンコーディングを設定します。 この設定は、プロセスの標準エラー出力の使用前に済ませる必要があります。既に何らかの標準エラー出力が行われた後に設定しても、反映されない可能性があります。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 (string型) errorEncoding : 標準エラー出力内容のテキストエンコーディング。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void setProcessWorkingDirectory( int processID, string workingDirectoryPath ) |
関数名 - Name |
setProcessWorkingDirectory |
役割 - Role |
プロセスの作業ディレクトリを設定します。 この設定は、startProcess によるプロセスの実行開始前に済ませる必要があります。実行開始後に設定しても、反映されません。 作業ディレクトリを何も設定せずにプロセスを実行した場合、VCSSLスクリプトがあるディレクトリ(メインディレクトリ)が作業ディレクトリになります。プロセスの実行ファイルがあるディレクトリではない事に注意してください。 なお、プロセスの作業ディレクトリは、環境によっては、必ずしも期待通りに設定されるとは限りません(デフォルト設定のディレクトリについても同様です)。例えば、古典的なシェル/コマンドライン端末上で、カレントディレクトリに設定できない特殊なパスは、作業ディレクトリとしての割り当てに失敗する可能性があります。失敗する既知の具体例としては、「ネットワークドライブとして接続されていない、ネットワーク上のディレクトリを指すUNC形式のパス」などがあります。 作業ディレクトリなどの諸条件を確実に制御し、デバッグもしやすくするには、「実行コマンドをシェルスクリプト等で包んで実行し、そのシェルスクリプト内で作業ディレクトリを設定する」などの方法が有効です。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 (string型) workingDirectoryPath : 作業ディレクトリのパス |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
int getProcessExitValue( int processID ) |
関数名 - Name |
getProcessExitValue |
役割 - Role |
プロセスの終了ステータスコードを返します。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(int型) プロセスの終了ステータスコード。 |
文法的定義 - Signature |
void waitForProcess( int processID ) |
関数名 - Name |
waitForProcess |
役割 - Role |
プロセスの実行が終了するまで、VCSSL側の実行を待機します。 |
引数 - Arguments |
(int型) processID : 対象プロセスのプロセスID。 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void onProcessStart(int processID) |
関数名 - Name |
onProcessStart |
役割 - Role |
プロセスが生成された際にコールされます。 |
引数 - Arguments |
(int型) processID : イベント発生元のプロセスID |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void onProcessEnd(int processID) |
関数名 - Name |
onProcessEnd |
役割 - Role |
プロセスが終了した際にコールされます。 |
引数 - Arguments |
(int型) processID : イベント発生元のプロセスID |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void onProcessOutput(int processID, string output) |
関数名 - Name |
onProcessOutput |
役割 - Role |
プロセスが標準出力を行った際にコールされます。ただし出力内容はバッファされるため、実際に出力が行われた瞬間にコールされるわけではなく、タイムラグが存在します。バッファがフラッシュされるタイミングは、厳密には処理系依存ですが、恐らく通常は行単位です。その場合、このイベントハンドラにも、出力内容が行単位で渡されます(ただし、処理系のバッファ容量を超過するような長い行では、1行の内容が区切られ、複数回に渡ってコールされる可能性もあります)。なお、改行を待たずに、任意のタイミングでバッファを強制的にフラッシュさせるには、flushProcessOutput 関数を使用してください。出力内容が文字化けする場合は、setProcessOutputEncoding で、プロセスに合った文字コードを設定してください。 |
引数 - Arguments |
(int型) processID : イベント発生元のプロセスID (int型) processID : 標準出力内容 |
戻り値 - Return |
(void型) |
文法的定義 - Signature |
void onProcessError(int processID, string output) |
関数名 - Name |
onProcessError |
役割 - Role |
プロセスが標準エラー出力を行った際にコールされます。ただし出力内容はバッファされるため、実際に出力が行われた瞬間にコールされるわけではなく、タイムラグが存在します。バッファがフラッシュされるタイミングは、厳密には処理系依存ですが、恐らく通常は行単位です。その場合、このイベントハンドラにも、出力内容が行単位で渡されます(ただし、処理系のバッファ容量を超過するような長い行では、1行の内容が区切られ、複数回に渡ってコールされる可能性もあります)。なお、改行を待たずに、任意のタイミングでバッファを強制的にフラッシュさせるには、flushProcessError 関数を使用してください。出力内容が文字化けする場合は、setProcessErrorEncoding で、プロセスに合った文字コードを設定してください。 |
引数 - Arguments |
(int型) processID : イベント発生元のプロセスID (int型) processID : 標準エラー出力内容 |
戻り値 - Return |
(void型) |