プロセス交換の実装とプロセス交換の並行性の実装

プロセス交換の実装とプロセス交換の並行性の実装

Bashのマニュアルによると

/dev/fdプロセス置換は、名前付きパイプ(fifo)または名前付きファイルを開く方法をサポートするシステムでサポートされています。

  1. これは、プロセスの置き換えが名前付きパイプまたは下のファイルを介して行われることを意味しますか/dev/fd
  2. Linuxでは、プロセスの交換はどのように実装されますか?

    次の例は、Linuxでプロセスの置き換えが名前付きパイプの代わりにファイルを介して実装/dev/fdされることを意味しますか?

    $ echo <(cat)
    /dev/fd/63
    
  3. ではcommand1 <(command2)、2つのコマンドが同時に実行されますか、それとも別のコマンドの実行が完了した後に1つのコマンドが開始されますか?

    プロセス交換が名前付きパイプを介して実装されている場合、プロセス交換例の2つのコマンドが同時に実行されることを意味しますか?私の考えは、パイプと名前付きパイプが同時に実行されるプロセス間の通信に使用され、パイプのコマンドが同時に実行されるためであるようです。

    回答のパート2を理解しようとしたときにこの問題が発生しました。 https://unix.stackexchange.com/a/286556/674

ありがとうございます。

答え1

  1. strace私のシステムの出力を見ると、strace -v -f -s150 -o log bash -c 'echo <(cat)'/ dev / fdがパイプとして実装されています。 3、4つのfdを持つパイプを作成し、3を63にコピーします。
  2. /dev/fdただシンボリックリンクです/proc/self/fd。私のシステムに/dev/fdシンボリックリンクがなく、出力は/proc/self/fd/63.Bashはパイプとしてのみ機能します。 Bashソースコードでは、他のbash'ismのようにエミュレートできるように見えますが、/dev/tcpわかりません。しかし、私はそのようなことをまったく見ませんでしたbusybox ash
  3. echobash全体を組み込みコマンドにtty置き換えると、最初に実行され、次にプリロードされたパイプラインfdを使用して実行されるstraceことがわかります。ttycat

答え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が完了するのを待つ必要があることを意味します。その後、省電力モードで終了します。

つまり、同時に実行されます。

関連情報