【Linux】プロセス間通信

2796 ワード

プロセスの実行時に独立性があるため、通信を行うのは難しいことです.異なるプロセス通信の前提は、異なるプロセスに同じリソースを表示させることです.通常、あるメモリを指します.
プロセス間通信の目的
  • データ転送:あるプロセスは、そのデータを別のプロセス
  • に送信する必要がある.
  • リソース共有:複数のプロセス間で同じリソースを共有する
  • 通知イベント:プロセスが終了したときに親プロセスに通知するなど、あるイベントが発生したことを通知するメッセージを別のプロセスまたはプロセスのセットに送信する必要があります.
  • プロセス制御:一部のプロセスでは、Debugプロセスなどの別のプロセスを完全に制御したい場合があります.この場合、制御プロセスは、別のプロセスのすべての陥没と異常を遮断し、その状態の変化をタイムリーに知ることができることを望んでいます.

  • プロセス間通信分類
  • パイプ:-匿名パイプ-名前付きパイプ
  • System V IPC
  • System V共有メモリ
  • 関連概念:
  • 臨界資源:複数のプロセスが共有する資源を臨界資源
  • と呼ぶ
  • 臨界領域:臨界資源にアクセスする行為を臨界領域と呼ぶ.
  • 反発:いずれの時点でも、反発と呼ばれる1つのプロセスのみが臨界リソースへのアクセスを許可します.
  • 同期:臨界資源の安全を保証する保証の下で、反発して、マルチプロセスに臨界資源にアクセスさせて、一定の順序を持って、私たちは同期と呼ばれています.
  • 原子性:通常、臨界リソースリソースにアクセスするか、アクセスしないか、アクセスするにはアクセスが完了します.この2つのステータスしかありません.実行動作を中断してはいけません.

  • パイプパイプパイプ:あるプロセスを別のプロセスに接続するデータストリームをパイプと呼びます.
    匿名パイプ匿名パイプツール親関係があり、親子プロセスで匿名パイプを作成するのによく使用されます.
    #include 
    int pipe(int fd[2]);
    

    fd:ファイル記述子配列、f[0]はリードを表し、f[1]はライトエンド戻り値を表す:成功戻り0、失敗戻りエラーコード
    プロセスを作成するとファイルの一部が開きます
    パイプの特徴
  • は、共通の祖先を有するプロセス(親縁関係を有するプロセス)間でしか通信できない.通常、パイプはプロセスによって作成され、プロセスはforkを呼び出し、親プロセスと子プロセスの間でパイプが適用されます.
  • パイプは、バイトストリーム向けのストリームサービスを提供します.
  • 一般的に、プロセスは終了し、パイプは解放されるので、パイプのライフサイクルはプロセスに従います.
  • 一般的に、カーネルはパイプ操作を同期および反発する.
  • パイプは半二重で、データは一方向にしか流れません.双方の通信が必要な場合は、2つのパイプを構築する必要があります.

  • 名前付きパイプパイプアプリケーションの1つの制限は、共通の祖先(親関係)を持つプロセス間でしか通信できないことです.関連のないプロセス間でデータを交換したい場合は、FIFOファイルを使用してこの作業を行うことができます.名前付きパイプと呼ばれることがよくあります.名前付きパイプは特殊なタイプのファイルです.
    名前付きパイプを作成するには
  • 名前付きパイプは、コマンドから作成できます.コマンドラインメソッドは、
  • です.
    $mkfifo filename 
    
  • ネーミングパイプはプログラムから作成することもできます.関連関数は
  • です.
    int mkfifo(const char *filename, mode_t mode);
    

    匿名パイプと名前付きパイプの違い
  • 匿名パイプpipe関数によって作成され、
  • が開きます.
  • 名前付きパイプはmkfifo関数で作成され、オープンはopen
  • で開きます.
  • FIFO(名前付きパイプ)とpipe(匿名パイプ)の唯一の違いは、これらの作業が完了すると同じ意味を持つ作成と開く方法が異なります.

  • System V共有メモリ
    共有メモリは、メモリです.このメモリは2つのプロセスで同時に見ることができる臨界リソースです.図に示すように、物理メモリに開き、ページテーブルを介して各プロセスの仮想アドレス空間の共有メモリセグメントにマッピングされます.
    共有メモリの作成:
    int shmget(ket_t key, size_t size, int shmflg);
    

    パラメータ1:共有メモリのユニークな番号、ftok関数によってパラメータを構築する2:共有メモリを開く必要があることを示すサイズ、単位はページで、少なくとも1ページの倍数、つまり4096 kの倍数パラメータ3:open関数のオプションと似ています.ここで重要な2つのパラメータ、IPC_CREAT(共有メモリの作成)、IPC_EXECL(前のパラメータと組み合わせて使用)は、共有メモリが存在しない場合に作成され、そうでない場合は作成に失敗します.IPC_CREAT単独使用が存在しない場合に使用し、存在する場合には既に存在する
    key_t ftok(const char* pathname, int proj_id);
    

    パラメータ1:パスパラメータを任意に与える2:数値を任意に与える
    利点:共有メモリを使用してプロセス間の通信を行うのは非常に便利で、関数のインタフェースは簡単で、データの共有はプロセス間のデータを転送する必要がなくて、直接メモリにアクセスして、プログラムの効率を速めました.
    欠点:共有メモリは同期と反発メカニズムを提供せず、ユーザーは自分で完成する必要がある.共有メモリを使用してプロセス間通信を行う場合は、他の手段でプロセス間の同期作業を行う必要があります.