外部プログラム呼び出し
自分自身の中で処理せず、外部のプログラムを呼び出したいことがある。
呼び出し方法には基本的に以下の分類がある。
とにかく起動するだけ。
起動してパラメータなどを渡す。
入出力ストリームを渡し、通信する。
外部プログラムと入れ替わる。(プロセスは同じだが、プログラムを差し替える。)
ソケット通信などの外部通信方法を使う。
C
table:C
system 外部プログラムを実行する。標準入出力はそのまま引き渡される。終了まで待つ。 K&R
popen 外部プログラムを実行し、外部プログラムの標準入出力を新たなファイルディスクリプタに割り当ててパイプとする。 POSIX.1-2001
execve 外部プログラムを現在のプロセスと置き換えて実行する。エラー時以外元のプログラムには戻らない。 SVr4, 4.3BSD, POSIX.1-2001
入力か出力のどちらか片方しかパイプにならない点に注意。(双方向にならない。)
双方向でのパイプが作りたいなら、pipe でパイプを作ってから fork して execve する。
exec* の関係
table:exec_func
l 引数は直接渡し (argv0, argv1, ..., argvN, NULL)
v 引数は配列渡し (argv[])
e Environment, 環境変数の指定
p Path, シェルのコマンド検索処理が行われる
exec* は execve のラッパーになっている。
e を指定しないと、環境変数は現在のプロセスから引き継がれる。
p を指定しないと、コマンド検索は行われない。
sh
単純に実行するのであれば、コマンド名と引数を指定すれば実行できる。
code:sh
command arg1 arg2 ... argN
バックグラウンドジョブとして並列に実行する場合
code:sh
command arg1 arg2 ... argN &
# 直前のバックグラウンドのプロセスIDを取得
bgpid=$!
コマンドの結果を変数に入れる場合
code:sh
r=$(command arg1 arg2 ... )
JavaScript(ブラウザ)
ブラウザから外部プログラムを呼び出すことは原則として禁止されている。
ブラウザの拡張機能を使って無理矢理呼び出すことは可能。
以前は NPAPI で実行することができた。
Chrome 21 からは PPAPI に
PHP