36.5 Controlling Subprocesses

Last-modified: 2025-03-09 (日) 15:29:45

36.5 サブプロセスの制御

systemOctave には、サブプロセスを開始するためのや など の高レベル コマンドが含まれていますpopen。別のプログラムを実行して何らかのタスクを実行し、その出力を確認する場合は、おそらくこれらの関数を使用する必要があるでしょう。

Octave には、サブプロセスの開始にも使用できる非常に低レベルの Unix ライクな関数もいくつか用意されていますが、高レベルの関数で必要な操作を実行する方法が見つからない場合にのみ、これらの関数を使用することをお勧めします。

: system ("string")
: system ("string", return_output)
: system ("string", return_output, type)
: [status, output] = system (…)
文字列で指定されたシェルコマンドを実行します。

システムが1つ以上の出力引数で呼び出された場合、またはオプション引数return_outputがtrueでサブプロセスが同期的に開始された場合、コマンドからの出力は変数として返されます。それ以外の場合、サブプロセスが同期的に実行されると、その出力は標準出力に送信されます。 systemページャーを介して実行されたコマンドの出力を送信するには、次のようなコマンドを使用します 。

[~, text] = system ("cmd");
more on;
disp (text);
or

more on;
printf ("%s\n", nthargout (2, "system", "cmd"));
オプション引数typeが の場合"async"、プロセスはバックグラウンドで開始され、子プロセスのプロセス ID が直ちに返されます。それ以外の場合、子プロセスが開始され、Octave はそれが終了するまで待機します。type 引数が省略された場合、デフォルトで値 になります "sync"。

このsystem関数は2つの値を返すことができます。1つ目はコマンドの終了ステータス、2つ目は標準出力ストリームに書き込まれたコマンドからの出力です。たとえば、

[status, output] = system ("echo foo & exit 2");
変数出力を文字列 'フー'、変数 ステータスを整数'2'。
非同期で実行されるコマンドの場合、ステータスはコマンドを実行するために開始されたコマンド シェルのプロセス ID になります。

コマンドを実行するために使用されるシェルはオペレーティングシステムによって異なりますが、通常はバイナリUNIXシステムおよびコマンドプロンプトWindows システムの場合。

See also: unix, dos.

: unix ("command")
: status = unix ("command")
: [status, text] = unix ("command")
: […] = unix ("command", "-echo")
Unix 系オペレーティング システムで実行している場合はシステム コマンドを実行し、それ以外の場合は何も行いません。

Octave は、外部コマンドが終了するまで待機してから、プログラムの終了ステータスをstatusに返し、出力があればtextに返します。

出力引数なしで呼び出された場合、または"-echo"引数が指定された場合、テキストは標準出力にも送信されます。

See also: dos, system, isunix, ismac, ispc.

: dos ("command")
: status = dos ("command")
: [status, text] = dos ("command")
: […] = dos ("command", "-echo")
Windows のようなオペレーティング システムで実行している場合はシステム コマンドを実行し、それ以外の場合は何も行いません。

Octave は、外部コマンドが終了するまで待機してから、プログラムの終了ステータスをstatusに返し、出力があればtextに返します。

出力引数なしで呼び出された場合、または"-

See also: unix, system, isunix, ismac, ispc.

: open file
: output = open (file)
ファイル名拡張子によって決定されるファイルの種類に基づいて、Octave または外部アプリケーションで ファイルを開きます。

デフォルトでは、認識されるファイルの種類は

.m
エディターでファイルを開きます。出力値は返されません。

.mat
octave-workspaceでデータ ファイルを開きますload。戻り値の出力 が要求されていない場合は、変数はベース ワークスペースにロードされます。それ以外の場合は、 出力はロードされたデータを含む構造体になります。load関数を参照してください。

.ofig
hgloadで図を開きます。hgload関数を参照してください。

.fig, .ofig
図を読み込む

.exe
プログラムを実行します (Windows システムのみ)。出力値は返されません。

関数openxxx(ここでxxxは拡張子)がロード パスに見つかった場合、カスタム ファイル拡張子も処理できます。関数は、ファイル名を入力として受け入れる必要があります。たとえば、 ファイル".dat"に対してデフォルトで行われるように、ベース ワークスペースにデータ ファイルをロードするには、次の内容で ".mat"を定義します 。"opendat.m"

function retval = opendat (fname)
 evalin ("base", sprintf ("load ('%s');", fname));
endfunction

その他のファイル タイプは適切な外部アプリケーションで開かれます。

: output = perl (scriptfile)
: output = perl (scriptfile, argument1, argument2, …)
: [output, status] = perl (…)
コマンドライン引数のリストを指定して、 Perl スクリプトscriptfileを呼び出します。

出力をoutputに返し、オプションのステータスをstatusに返します。scriptfile が絶対ファイル名でない場合は、現在のディレクトリで検索され、次に Octave ロードパスで検索されます。
See also: system, python.

: output = python (scriptfile)
: output = python (scriptfile, argument1, argument2, …)
: [output, status] = python (…)
コマンドライン引数のリストを指定して、 Python スクリプトscriptfileを呼び出します。

出力をoutputに返し、オプションのステータスをstatusに返します。scriptfile が絶対ファイル名でない場合は、現在のディレクトリで検索され、次に Octave ロードパスで検索されます。

プログラミング ノート: UNIX システムでは、スクリプトは によって実行され python3、Windows では によって実行されます。これらのデフォルトは、たとえば Octave 内から を使用して環境変数pythonを設定することで上書きできます。 PYTHONsetenv PYTHON /usr/local/bin/python3

See also: system, perl.

: fid = popen (command, mode)
プロセスを開始し、パイプを作成します。

実行するコマンドの名前はcommandで指定します。引数 modeは

"r"
パイプはプロセスの標準出力に接続され、読み取り用に開かれます。

"w"
パイプはプロセスの標準入力に接続され、書き込み用に開かれます。

プロセスの入力または出力ストリームに対応するファイル識別子がfidに返されます。

例えば:

fid = popen ("ls -ltr / | tail -3", "r");
while (ischar (s = fgets (fid)))
 fputs (stdout, s);
endwhile
  -| drwxr-xr-x  33 root  root  3072 Feb 15 13:28 etc
  -| drwxr-xr-x   3 root  root  1024 Feb 15 13:28 lib
  -| drwxrwxrwt  15 root  root  2048 Feb 17 14:53 tmp

See also: popen2.

: status = pclose (fid)
fidpopenによって開かれたファイル識別子を閉じます。

成功した場合はfclose0 を返し、それ以外の場合は -1 を返します。

プログラミング ノート: この関数はfclose同じ目的にも使用できます。

See also: fclose, popen.

: [in, out, pid] = popen2 (command, args)
双方向通信でサブプロセスを開始します。

プロセスの名前はcommandによって指定され、args はコマンドのオプションを含む文字列の配列またはセル配列です。

サブプロセスの入力ストリームと出力ストリームのファイル識別子は、 in と out に返されます。コマンドの実行が成功した場合、pid にはサブプロセスのプロセス ID が含まれます。それ以外の場合、 pidは -1 になります。

例えば:

[in, out, pid] = popen2 ("sort", "-r");
fputs (in, "these\nare\nsome\nstrings\n");
fclose (in);
EAGAIN = errno ("EAGAIN");
done = false;
do
 s = fgets (out);
 if (ischar (s))
   fputs (stdout, s);
 elseif (errno () == EAGAIN)
   pause (0.1);
   fclear (out);
 else
   done = true;
 endif
until (done)
fclose (out);
waitpid (pid);
  -| these
  -| strings
  -| some
  -| are

popen2とは異なりpopen、 は子プロセスを「刈り取る」ことはないことに注意してください。 を使用してwaitpid子の終了ステータスをチェックしない場合は、Octave が終了するまで残ります。

See also: popen, waitpid.

: val = EXEC_PATH ()
: old_val = EXEC_PATH (new_val)
: old_val = EXEC_PATH (new_val, "local")
外部プログラムを実行するときにシェル PATH に追加するディレクトリのコロンで区切られたリストを指定する内部変数を照会または設定します。

の初期値は環境変数から取得されます OCTAVE_EXEC_PATHが、その値はコマンドライン引数によって上書きできます。--exec-path パス。

オプションを使用して関数内から呼び出されると"local"、関数とそれが呼び出すサブルーチンに対して変数がローカルに変更されます。関数を終了すると、元の変数値が復元されます。

See also: IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME.

ほとんどの場合、以下の関数は引数をデコードし、対応する Unix システム コールを実行するだけです。これらの使用方法の完全な例については、関数の定義を参照してくださいpopen2。

: [pid, msg] = fork ()
現在のプロセスのコピーを作成します。

Fork は次のいずれかの値を返します。

> 0

親プロセスにいます。 から返される値は、fork子プロセスのプロセス ID です。 子プロセスが終了するまで待機するように設定する必要があります。

0

子プロセスにいます。 を呼び出してexec別のプロセスを開始できます。 それが失敗した場合は、 を呼び出す必要がありますexit。

< 0

何らかの理由で の呼び出しがfork失敗しました。回避策を講じる必要があります。システム依存のエラー メッセージがmsgに待機しています。

: [err, msg] = exec (file, args)
現在のプロセスを新しいプロセスに置き換えます。

exec最初に呼び出しを行わずに呼び出すと、現在のOctaveプロセスが終了し、 fileforkで指定されたプログラムに置き換えられます。たとえば、

exec ("ls", "-l")

が実行されls、シェルプロンプトに戻ります。

成功した場合はexec戻りません。exec戻る場合は、 err はゼロ以外になり、msg にはシステム依存のエラー メッセージが含まれます。

: [read_fd, write_fd, err, msg] = pipe ()
パイプを作成し、パイプの読み取り側と書き込み側を それぞれread_fdとwrite_fdに返します。

成功した場合、errは 0 で、msg は空の文字列になります。それ以外の場合、errは 0 以外で、msgにはシステム依存のエラー メッセージが含まれます。

See also: mkfifo.

: [fid, msg] = dup2 (old, new)

ファイル記述子を複製します。

成功した場合、fid は0 より大きくなり、新しいファイル ID が含まれます。それ以外の場合、fidは負になり、msg にはシステム依存のエラー メッセージが含まれます。

See also: fopen, fclose, fcntl.

: [pid, status, msg] = waitpid (pid, options)
プロセスpidが終了するまで待機します。

pid引数は次のようになります。

-1
子プロセスを待機します。

0
プロセス グループ ID が Octave インタープリタ プロセスのものと等しい子プロセスを待機します。

0
ID pidの子プロセスの終了を待ちます。

オプション引数には、次の定数の 0 個以上のビット単位の OR を指定できます。

0
シグナルが受信されるか、子プロセスが終了するまで待機します (オプション引数がない場合、これがデフォルトです)。

WNOHANG
ステータスがすぐに利用できない場合はハングしないでください。

WUNTRACED
停止されている子プロセスのうち、停止してからステータスがまだ報告されていない子プロセスのステータスを報告します。

WCONTINUE
停止した子プロセスが の配信によって再開された場合に返しますSIGCONT。この値はすべてのシステムで意味を持つとは限りません。

pidの戻り値が0 より大きい場合、それは終了した子プロセスのプロセス ID です。エラーが発生した場合、pid は0 未満になり、msg にはシステム依存のエラー メッセージが含まれます。status の値には、終了したサブプロセスに関する追加のシステム依存情報が含まれます。

See also: WCONTINUE, WCOREDUMP, WEXITSTATUS, WIFCONTINUED, WIFSIGNALED, WIFSTOPPED, WNOHANG, WSTOPSIG, WTERMSIG, WUNTRACED.

: v = WCONTINUE ()
マクロの数値を返しますWCONTINUE。

WCONTINUEwaitpid停止した子プロセスがシグナルの配信によって再開された場合にも返されることを示すために渡されるオプション引数です SIGCONT。

See also: waitpid, WNOHANG, WUNTRACED.

: tf = WCOREDUMP (status)
の呼び出しからのステータスが指定されwaitpid、子がコア ダンプを生成した場合は true を返します。

この関数は、true が返される場合にのみ使用してくださいWIFSIGNALED。この関数を実装するために使用されるマクロは、POSIX.1-2001 では指定されておらず、一部の Unix 実装 (AIX、SunOS など) では使用できません。

See also: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.

: tf = WEXITSTATUS (status)
waitpidの呼び出しからのステータスが与えられ、子の終了ステータスを返します。

この関数はWIFEXITEDtrue が返される場合にのみ使用してください。

See also: waitpid, WIFEXITED, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.

: tf = WIFCONTINUED (status)
の呼び出しからのステータスが与えられwaitpid、子プロセスが の配信によって再開された場合は true を返しますSIGCONT。

See also: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG.

: tf = WIFSIGNALED (status)
の呼び出しからのステータスが与えられwaitpid、子プロセスがシグナルによって終了された場合は true を返します。

See also: waitpid, WIFEXITED, WEXITSTATUS, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.

: tf = WIFSTOPPED (status)
の呼び出しからのステータスが与えられwaitpid、シグナルの配信によって子プロセスが停止された場合は true を返します。

これは、呼び出しが を使用して行われた場合WUNTRACED、または子プロセスがトレースされている場合にのみ可能です (ptrace(2) を参照)。
See also: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WSTOPSIG, WIFCONTINUED.

: tf = WIFEXITED (status)
の呼び出しからのステータスが与えられwaitpid、子プロセスが正常に終了した場合は true を返します。

See also: waitpid, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.

: v = WNOHANG ()
マクロの数値を返しますWNOHANG。

WNOHANGwaitpidプロセスが終了するのを待つのではなく、すぐにステータスを返す必要があることを示すため に渡すことができるオプション引数です 。

See also: waitpid, WUNTRACED, WCONTINUE.

: tf = WSTOPSIG (status)
の呼び出しからのステータスが与えられwaitpid、子プロセスを停止させたシグナルの番号を返します。

この関数はWIFSTOPPEDtrue が返される場合にのみ使用してください。

See also: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WCOREDUMP, WIFSTOPPED, WIFCONTINUED.

: tf = WTERMSIG (status)
の呼び出しからのステータスが与えられwaitpid、子プロセスを終了する原因となったシグナルの番号を返します。

この関数はWIFSIGNALEDtrue が返される場合にのみ使用してください。

See also: waitpid, WIFEXITED, WEXITSTATUS, WIFSIGNALED, WCOREDUMP, WIFSTOPPED, WSTOPSIG, WIFCONTINUED.

: v = WUNTRACED ()
マクロの数値を返しますWUNTRACED。

WUNTRACED子プロセスが停止したがシステムコール waitpidでトレースされていない場合にも返されることを示すために渡されるオプション引数です。 ptrace

See also: waitpid, WNOHANG, WCONTINUE.

: fcntl (fid, request, arg)
: [status, msg] = fcntl (fid, request, arg)
開いているファイルfidのプロパティを変更します。

次の値がリクエストとして渡される可能性があります:

F_DUPFD
重複したファイル記述子を返します。

F_GETFD
fidのファイル記述子フラグを返します。

F_SETFD
fidのファイル記述子フラグを設定します。

F_GETFL
fidのファイル ステータス フラグを返します。次のコードが返される可能性があります (一部のフラグはシステムによっては未定義の場合があります)。

O_RDONLY
閲覧のみ可能です。

O_WRONLY
書き込み専用です。

O_RDWR
読み取りと書き込み用にオープン。

O_APPEND
書き込みごとに追加します。

O_CREAT
ファイルが存在しない場合は作成します。

O_NONBLOCK
非ブロッキングモード。

O_SYNC
書き込みが完了するまで待ちます。

O_ASYNC
非同期I/O。

F_SETFL
fidのファイル ステータス フラグをargで指定された値に設定します。変更できるフラグはO_APPEND と のみ ですO_NONBLOCK。

成功した場合、ステータスは 0 で、msgは空の文字列になります。それ以外の場合、 ステータスは -1 で、msgにはシステム依存のエラー メッセージが含まれます。

See also: fopen, dup2.

: kill (pid, sig)
: [status, msg] = kill (pid, sig)
プロセスpidにシグナルsigを送信します。

pidが正の場合、シグナルsigがpidに送信されます。

pidが 0 の場合、シグナルsigは現在のプロセスのプロセス グループ内のすべてのプロセスに送信されます。

pidが -1 の場合、シグナルsigはプロセス 1 を除くすべてのプロセスに送信されます。

pidが -1 未満の場合、シグナルsigはプロセス グループ-pid内のすべてのプロセスに送信されます。

sigが 0 の場合、シグナルは送信されませんが、エラー チェックは実行されます。

成功した場合、ステータスは 0 で、msgは空の文字列になります。それ以外の場合、ステータスは -1 で、msgにはシステム依存のエラー メッセージが含まれます。

: S = SIG ()
Unix シグナル名とその定義値を含む構造体を返します。