posixシェルを使用して子プロセスの別々の入力ファイル記述子にデータを渡す

posixシェルを使用して子プロセスの別々の入力ファイル記述子にデータを渡す

posixシェルからデータをバックグラウンドサブプロセスファイル記述子に渡し、親プロセスから子プロセスの出力を処理したいと思います。

mkfifoを使用せず、標準のposixシェルファイル記述子のコピーのみを使用してください。プロセス置換()などのPOSIX以外の機能はありません<(cmd)。中間ファイルはありません。 /dev/fd または /dev/std{in,out,err} または /proc/pid はありません。

次のようなものです(これはうまくいかないので、私の概念とそれに伴ういくつかのコメントの説明は非常に混乱しています)。

child()
{
  sed '1s|^|child: |;q'   # prepend 'child: ' to first input line and quit
}

exec 4>&1           # open file descriptor 4 duplicated as stdout

# give the shell some time to start the child, then send data to child via fd 4
{ sleep 2; echo foo >&4; } &

out=$(child 4<&0)   # connect fd 4 to stdin in child process

echo "out: $out"

'child: foo'私はそれを見たかったですout。しかし、代わりにfoostdoutでチェックしてchild()決して終了しません(明らかにデータは子の入力ファイル記述子には入らません)。

修正する:リクエストに応じてユースケースを追加します。

ループでは、ループを介して毎回そのユーティリティを再生成せずにstdinを読み取るユーティリティにデータを送信します。ユーティリティはループを通過するたびに再フォーク/実行する必要があるため、高価です。したがって、ユーティリティをバックグラウンドサブプロセス(一度だけ実行)として実行し、サブプロセスで使用可能な入力ファイル記述子を介して親プロセスのデータを送信します。

アップデート2:

私は本当にmkfifoがやっていることをやろうとしています(親の出力fdが子の入力fdに接続され、子のout fdが親のin fdに接続される入力/出力fdペアを作成します)。 )しかし、mkfifoは使用できません(そして、可能であれば一時パイプファイルはありません。つまり、匿名のファイル記述子のみが使用されます)。

ベストアンサー1

おすすめ記事