C言語プログラミング-パイプ(Pipe)

2911 ワード

目次
文書ディレクトリ
  • ディレクトリ
  • Linuxの配管指令
  • C言語の匿名パイプ
  • 名前付きパイプ
  • 匿名パイプと命名パイプの違い
  • 参照文書
  • Linuxの配管指令
    Linuxに詳しいなら、パイプに慣れていないはずですが、私たちはよく「|」を使ってパイプを使います.しかし、パイプの本当の定義は何ですか?
  • パイプは、通常、あるプロセスの出力をパイプを介して別のプロセスに接続する入力として使用するプロセス接続データが別のプロセスに流れる通路である.

  • 例:ls -l | grep string.
    C言語の匿名パイプ
    C言語の匿名パイプpipe()はヘッダファイルunistdに定義する.h中.
    int pipe(filedes[2]);
    
  • filedes[2]:pipeから返される2つのファイル記述子を受信するために使用される:filedes[0]はリードパイプ、filedes[1]はライトパイプである.
  • 戻り値:成功して0を返し、失敗して-1を返し、errnoを設定します.

  • 匿名パイプは実質的に先進先出(FIFO)のキューである:filedes[0]はキューヘッダ(front)、filedes[1]はキューテール(rear)である.pipe()で作成されたパイプは、本質的にカーネルバッファであり、このバッファのサイズは一般的に1ページ、すなわち4 Kバイトである.
    名前付きパイプ
    匿名パイプを介してプロセス間でデータを転送する欠陥は、これらのプロセスが共通の親プロセスによって開始されることです.これは、関連しない2つのプロセスの前にデータを交換するのに不便なため、C言語は「名前付きパイプ」に入り、関連しないプロセス間の通信問題を解決するために使用されます.
    名前付きパイプは「FIFOファイル」とも呼ばれ、匿名パイプと同様の動作をするファイルシステムにファイル名として存在する特殊なタイプのファイルです.Linuxではすべてファイルなので、ネーミングパイプの使用はファイルの操作方法とほぼ一致し、コマンドラインで使用できます.
    次の2つの関数のいずれかを使用して、名前付きパイプを作成できます.
  • ヘッダファイルsys/types.h、sys/stat.hで定義されている:
  • int mkfifo(const char *filename, mode_t mode);
    int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0);
    

    どちらの関数もFIFOファイルを作成できます.実際にファイルシステムに存在するファイルが作成され、filenameがファイル名を指定し、modeがファイルの読み書き権限を指定していることに注意してください.
  • は、Shellでコマンドmkfifo、mknodを直接使用してFIFOファイルを作成することができます:
  • $ mkfifo fifo_file
    $ mknod fifo_file p
    

    匿名パイプと名前付きパイプの違い
    匿名パイプを使用すると、通信のプロセスの間に親子関係が必要になります.通信の2つのプロセスは必ず共通の祖先プロセスによって起動され、匿名パイプはデータ交差の問題がありません.
    名前付きパイプを使用する2つのプロセスには「血縁」関係はありませんが、データの安全を保証するために、ブロックされたFIFOを採用し、書き込み操作を原子操作に変えることが多いです.
    リファレンスドキュメント
    https://www.zfl9.com/c-ipc-pipe.html