技術共有

プロセス間通信 - パイプ

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

ここに画像の説明を挿入します

1. プロセス通信の概要

1.1 プロセス間で通信が必要な理由

プロセス間のコラボレーションが必要です。 たとえば、学校内のすべての管理レベルは相互に関連しており、垂直的に管理することはできません。コラボレーションの前提条件は、プロセスが通信する必要があるためです。一部のデータは通知可能なデータであり、一部のデータは制御関連のデータです。

事実: プロセスは独立しています。プロセス = カーネル データ構造、プロセスのコードとデータ

プロセス通信の目的:

  • データ転送: あるプロセスはそのデータを別のプロセスに送信する必要があります。
  • リソース共有: 複数のプロセス間で同じリソースを共有します。
  • 通知イベント: プロセスは、別のプロセスまたはプロセスのグループにメッセージを送信して、特定のイベントが発生したことを通知する必要があります (プロセスの終了時に親プロセスに通知するなど)。
  • プロセス制御: 一部のプロセスは、別のプロセス (デバッグ プロセスなど) の実行を完全に制御することを望んでいます。このとき、制御プロセスは、別のプロセスのすべてのトラップと例外をインターセプトし、そのステータスの変化を時間内に把握できることを望んでいます。

1.2 プロセスの通信方法

プロセス間の通信コストは若干高くなる可能性があります。プロセスは独立しており、あるプロセスによって開かれたリソースは別のプロセスには表示されません。先ほど親子プロセスの話をしましたが、これは親プロセスのデータが子プロセスに引き継がれるわけではありません。そして常に情報を発信できること。

プロセス間通信の前提: まず、異なるプロセスが同じ (オペレーティング システム) リソース (「メモリの一部」) を参照できるようにします。 2 つのプロセスは独立しています。通信を行うには、2 つのプロセスが同じメモリを持てるようにするためのツール、つまりオペレーティング システムが必要です。オペレーティング システムがこれを行う理由はユーザーが決定します。
オペレーティング システムにリソースを作成するように指示する方法:

  1. 特定のプロセスが最初に通信し、OS に共有リソースを作成させる必要があるはずです。
  2. OS は、プロセスがシステム コールを通じてシステム リソースを申請できるようにするために、多くのシステム コールを提供する必要があります。
    OS によって作成されるさまざまな共有リソースとさまざまなシステム コール インターフェイスによって、さまざまな種類のプロセス間通信が決まります。

ここに画像の説明を挿入します

2. パイプライン

2.1 匿名パイプライン

2.1.1 ファイル記述子理解パイプライン

ここに画像の説明を挿入します

パイプラインは基本的に、ディスクにフラッシュする必要のないメモリ レベルのファイルです。
まず、親プロセスは読み取りおよび書き込みモードでファイルを 2 回開きます。ファイルを 2 回開く理由は、2 つの構造体ファイル オブジェクトを取得して、ファイルに対して 2 つの読み取りおよび書き込みポインターが存在し、読み取りおよび書き込み操作が行われるようにするためです。このようにして、読み取りと書き込みは相互に影響を与えません。読み取り/書き込みポインタは、現在のファイルの読み取りまたは書き込み位置を記録します。struct file ファイル内に読み取り/書き込みポインタは 1 つだけあり、ファイルに書き込み (または読み取り) を行うと、読み取り/書き込みポインタが移動し、再度読み取り (書き込み) が行われます。この時点では、読み取り/書き込みポインタは存在しません。元の位置にあるため、書き込まれた内容を読み取ることができないため、同じファイルを別の方法で 2 回開く必要があります。次に、子プロセスを作成します。子プロセスは、親プロセスで開かれたファイルを継承します。つまり、親プロセスと子プロセスは、同じファイル リソースを共有します。プロセスはファイルに書き込む際に、ファイル記述子3番を介してファイルを読み込むことができます。このとき、親プロセスと子プロセスはデータの送信、つまり通信を実現します。 。親プロセスと子プロセスは同じメモリ バッファーを参照します。ここではこれをパイプ ファイルと呼びます。パイプは単純であるため、一方向の通信のみを許可します。

親子プロセスが同じモニター端末にデータを出力するのはなぜですか?
対応する子プロセスは、親プロセスに対応するファイル記述子テーブルを継承し、同じファイルを指すため、つまり、親プロセスがファイルを入力し、子プロセスもファイルを入力することになります。同じものがバッファに書き込まれ、オペレーティング システムは同じモニタにフラッシュします。


このプロセスでは、デフォルトで 3 つの標準入力と標準出力が開きます: 0、1、2... デフォルトで 0、1、2 を開くにはどうすればよいですか?
すべてのコマンドは、bash子プロセス (次の限り)bashこれをオンにすると、すべての子プロセスがデフォルトでオンになります。


親プロセスによるモニター ファイルの継続的な使用に影響を与えずに、子プロセスがアクティブに終了 (0/1/2) するのはなぜですか?
メモリレベルの参照カウント--、メモリ レベルの参照カウントが 0 まで減少すると、ファイル リソースが解放されます。


親子プロセスは不要なファイル記述子を閉じますが、なぜ以前に開く必要があったのでしょうか?
子プロセスに継承を許可するため。閉じる必要はありませんが、誤って書き込みを防ぐために閉じることをお勧めします。


なぜパイプは一方向通信なのでしょうか?
この方法はシンプルで、開発コストが削減され、一方向の通信のみが可能です。ファイルはバッファに更新され、その後、データがファイルに更新されます。このプロセス自体は一方向です。
私たちが日常的に目にする単純なパイプは、水道管のようにすべて一方通行であり、パイプラインの特性に従って入口と出口が 1 つずつあります。

2.1.2 インターフェースの使用法

使えるpipe名前のないパイプを作成する場合、パラメータにはファイル パスとファイル名は必要ありません。

int pipe(int pipefd[2]);