この記事では、パイプ、匿名パイプ、共有メモリ、その他の関連問題など、Linux のプロセス間通信に関する関連知識を提供します。皆様のお役に立てれば幸いです。
#·プロセス間通信: システムがプロセス間通信を実装するためにオペレーティング システムによって提供されるメソッド
各プロセスは独立した仮想アドレス空間を持ち、自身の仮想アドレスにアクセスするため、プロセス間で直接通信することは不可能です。シナリオが異なるため、さまざまな通信方式を提供 プロセス間通信方式の種類: パイプ、共有メモリ、メッセージキュー、セマフォ ・パイプライン機能: 半二重通信 -- 方向を選択できる一方向通信
# 本質: カーネル内のバッファ (メモリの一部) を開きます。カーネル空間) 原則: 複数のプロセスは、同じカーネル内のバッファにアクセスすることで通信します (バッファの操作ハンドルをコピーします) 分類: 匿名パイプ: バッファには識別子がなく、アフィニティのプロセス間通信でのみ使用できます 名前付きパイプ: バッファーには識別子があり、同じホスト上のプロセス間通信に使用できます Linux ではすべてがファイルです--すべてがファイルとして扱われます。同じ操作 (パイプを含む) を実行し、IO 操作を通じてパイプへのアクセスを完了します。 ·匿名パイプ
戻り値: 成功した場合は 0、失敗した場合は -1
# 機能: アフィニティによるプロセス間通信にのみ使用可能 匿名パイプには識別子がありません、他のプロセスでは見つけることができず、子プロセスから親プロセスをコピーすることによってのみ、通信を確立するための操作ハンドルを取得できます。読み取りと書き込みの特性: パイプ内にデータがない場合、読み取りはブロックされます
パイプ内のデータがいっぱいの場合、書き込みはブロックされます
すべてのパイプラインの読み取り側が閉じられており、書き込みを続行すると異常がトリガーされ、プロセスがクラッシュして
すべてのパイプラインが閉じられます。完了後は 0 が返されます。
注: パイプは半二重通信です。通信中、方向を選択したら、未使用の端を閉じる必要があります。
·
名前付きパイプ:は本質的に カーネル内のバッファ であり、識別子 Can が付いています。他のプロセスによって検出されるため、同じホスト上のプロセス間通信に使用できます。 名前付きパイプの識別子は、ファイル システムで認識できるパイプ タイプのファイルです。 複数プロセスは同じ A パイプ ファイルを開き、同じカーネル内のバッファにアクセスして通信を行うことができます。
コマンド操作: mkfifo filename 名前付きパイプ ファイルを作成します。 関数操作: int mkfifo(const char * pathname, mode_t mode) ; パス名: ファイル名; モード: 作成権限 戻り値: 成功した場合は 0 が返され、失敗した場合は -1 が返されます##·概要:
パイプの本質: カーネル空間内のバッファ
原則: 複数のプロセスが同じバッファにアクセスすることでデータ送信を実現します カテゴリ: 匿名パイプ、名前付きパイプ using use with ’ s ’ ’ s ’ through ’ s through ‐ through ‐ ‐‐‐‐ ‐ to. # -- 方向を選択できる一方向通信
バイト ストリーム送信サービスを提供します: 順序付けされた信頼性の高い接続ベースのストリーミング送信
# 接続ベース: すべてのリーダーが閉じられます 書き込み側が閉じられている場合、読み取りは 0 を返します
# 相互排他的: いくつかの条件判断を通じて、重要なリソースへのプロセスのアクセスをより合理的かつ秩序的にします。# Write Blocks
# #・共有メモリ:
プロセス間のデータ共有を実現するために使用されます
本質: 物理メモリの一部 原理: 物理メモリ空間を開き、複数のプロセスをマップします同じブロックを独自の仮想メモリに配置します。アドレス空間は仮想アドレスを通じて直接アクセスされ、データ共有を実現します。
特長: 最速のプロセス間通信方式、ライフサイクルはカーネルに従う 共有メモリは、仮想アドレスを介して物理メモリに直接アクセスし、データ共有を実現します。データは転送する必要があります。カーネルにコピーし、使用時にユーザー モードにコピーするため、2 つのデータ コピー操作が不要になります。#注: 共有メモリを操作する場合はセキュリティに注意する必要があります
操作手順:
①共有メモリを作成またはオープンします# ##プロセスの仮想アドレス空間にマッピングされ、共有メモリはプロセスの仮想アドレス空間にマッピングされます。## int shmget(key_t key, size_t size, int shmflg);
key: 識別子 (複数のプロセスが同じ識別子を介して同じ共有メモリを開きます) size:作成中に開かれるスペースのサイズ (メモリ ページ内) shmflg: 開く方法 作成許可--IPC_CREAT|IPC_EXCL|0664 --操作ハンドル。失敗すると -1# が返されます。 ##
void *shmat(int shmid, const void *shmaddr, int shmflg);shmid: shmget によって返される操作ハンドル shmaddr: マッピング アドレス。通常は次のように設定されます。ヌル ###### ######
int shmdt(const void *shmaddr);int shmdt(const void *shmaddr); #
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid: shmget によって返される操作ハンドルcmd: 操作タイプ --IPC_RMID 共有マークメモリが破壊されました
buf: IPC_RMID の場合、成功した場合は 0 が返され、失敗した場合は -1 が返されます ·メッセージ キュー本質: カーネル内の優先キュー。複数のプロセスが同じキューにアクセスし、キューにノードを追加または取得して、プロセス間のデータ ブロック送信を実現します。
機能: 組み込みの同期と相互排他、寿命サイクルはカーネルによって変わります。
·セマフォ本質: カーネル内のカウンター PCB 待機キュー
機能:プロセス間の同期と相互排他を実現し、プロセスによる重要なリソースへのアクセスを調整するために使用されます。 P 操作: カウンタ -1、カウントが 0 未満かどうかを判断し、プロセスをブロックします。 V操作: カウンタ 1、ウェイクアップ ブロックされたプロセス は、独自のカウンタを介してリソースをカウントし、そのカウントを使用して、プロセスによるリソースの取得が妥当かどうかを判断します。妥当でない場合は、ブロックされます。リソースが生成されるのを待った後、ブロックされたプロセスを起動します。同期実装: カウンタを介してリソースをカウントし、リソースを取得する前に P 操作を実行します。 相互排他的実装: カウンタは 1 (リソースが 1 つだけであることを意味します) プロセスはリソースにアクセスする前に P 操作を実行し、リソースにアクセスした後に V 操作を実行します
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinux のプロセス間通信の古典的な手法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。