Bashのマニュアルによると
/dev/fd
プロセス置換は、名前付きパイプ(fifo)または名前付きファイルを開く方法をサポートするシステムでサポートされています。
- これは、プロセスの置き換えが名前付きパイプまたは下のファイルを介して行われることを意味しますか
/dev/fd
? Linuxでは、プロセスの交換はどのように実装されますか?
次の例は、Linuxでプロセスの置き換えが名前付きパイプの代わりにファイルを介して実装
/dev/fd
されることを意味しますか?$ echo <(cat) /dev/fd/63
では
command1 <(command2)
、2つのコマンドが同時に実行されますか、それとも別のコマンドの実行が完了した後に1つのコマンドが開始されますか?プロセス交換が名前付きパイプを介して実装されている場合、プロセス交換例の2つのコマンドが同時に実行されることを意味しますか?私の考えは、パイプと名前付きパイプが同時に実行されるプロセス間の通信に使用され、パイプのコマンドが同時に実行されるためであるようです。
回答のパート2を理解しようとしたときにこの問題が発生しました。 https://unix.stackexchange.com/a/286556/674。
ありがとうございます。
答え1
strace
私のシステムの出力を見ると、strace -v -f -s150 -o log bash -c 'echo <(cat)'
/ dev / fdがパイプとして実装されています。 3、4つのfdを持つパイプを作成し、3を63にコピーします。/dev/fd
ただシンボリックリンクです/proc/self/fd
。私のシステムに/dev/fd
シンボリックリンクがなく、出力は/proc/self/fd/63
.Bashはパイプとしてのみ機能します。 Bashソースコードでは、他のbash'ismのようにエミュレートできるように見えますが、/dev/tcp
わかりません。しかし、私はそのようなことをまったく見ませんでしたbusybox ash
。echo
bash全体を組み込みコマンドにtty
置き換えると、最初に実行され、次にプリロードされたパイプラインfdを使用して実行されるstrace
ことがわかります。tty
cat
答え2
1.、2.:はい、プロセスの交換これは名前付きパイプを介して達成されます。(オープンソース=ソースコードを読むことができます)
三。
プロセス交換が名前付きパイプを介して実装されている場合、プロセス交換例の2つのコマンドが同時に実行されることを意味しますか?
はい、これは同時に実行されることを意味します。
答え3
ポイント3の場合、以下を定義すると:
$ d(){ printf '%7s %7s %s\n' "$BASHPID" "$1" $(date -u +'%H:%M:%S'); }
$ p1(){ d START; readarray -t a; printf '%s\n' "${a[@]}" ; sleep 2; d END; }
$ p2(){ d START; sleep 2; d END; }
それでは、次のようになります。
$ p1 < <(p2)
以下を印刷します。
8517 START 20:31:38
11764 START 20:31:38
11764 END 20:31:40
8517 END 20:31:42
これは両方とも始まりますが、p1は読み取りを閉じる前にp2が完了するのを待つ必要があることを意味します。その後、省電力モードで終了します。
つまり、同時に実行されます。