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