パイプ(管)は、一方向であるため、それはまた、半二重パイプを知られている、2つのプロセス間の片方向通信のための機構です。これは主に、単純なプロセス間通信のために使用されています。
- データは、他のプロセスへのプロセスの流れによって(ライト・パイプライン、パイプラインの読み取り)することができ、あなたは全二重通信をしたい場合は、2つのパイプラインを構築する必要があります。
- パイプラインは、親と子または兄弟プロセス間の通信のために使用することができます。
- パイプには名前、およびその制限されたバッファサイズを持っていません。
- パイプにデータを書き込む処理は、各時刻データがパイプのバッファの末尾に追加され、別のプロセスがパイプの他端からデータを読み取るために、ヘッドは、バッファからデータを読み出します。
コマンドパイプラインを作成します。
する#include <unistd.h> int型のパイプ(INT FD [ 2 ])
それぞれのパイプの端部記述子fd [0]、FD [1]について説明します。読み取り専用、読み取りと呼ばれる管端用のFD [0]請求; FD [1]パイプ端と呼ばれる、書くために使用することができます。
一般的な使用パイプ:親プロセスがパイプの読み出し側を閉じる(またはライト側)にした後、パイプラインを作成し、フォークで子プロセスを作成するには、子プロセスがパイプラインへの書き込みに、親プロセスを書き込みパイプの端部(またはリード終了)を閉じます入力し、子供はパイプからデータを読み取ることができるようになります。
例:
する#include <stdio.hに> する#include <STDLIB.H> する#include < 文字列・H> の#includeは<sys / types.h>に する#include <unistd.h> / * 读管道* / ボイド read_from_pipe(INT FD) { チャーメッセージ[ 100 ]。 READ(FD、メッセージ、100 )。 printf(" パイプから読み出された:%S " 、メッセージ)。 } / * 写管道* / ボイド write_to_pipe(int型FD) { チャー *メッセージ= " こんにちは、パイプ\ N!" 、 書き込み(FD、メッセージ、strlenを(メッセージ) + 1 ); } int型メイン(ボイド) { int型 FD [ 2 ]; pid_tのPID; INT stat_val; もし(パイプ(FD)) { のprintf (" !失敗したパイプを作成\ n " ); 出口(1 ); } PID = フォーク(); スイッチ(PID) { ケース - 1: printf(" N- \フォークエラー!" ); 出口(1 ); ケース 0 : / * 子プロセス近いFD1 * / 閉じるを使用(FD [ 1 ]); read_from_pipe(FD [ 0 ]); 終了(0 ); デフォルト: / * 親近いfd0と* / 閉じる(FD [ 0 ]); write_to_pipe(FD [ 1 ])。 (待つ&stat_val)。 出口(0 ); } 戻り 0 。 }
名前付きパイプ
ダクトの一つの欠点は、それが唯一の遺伝的関係のプロセス間の通信を持つことができ、何の名前ではありません。逆に「名前付きパイプ」にも無関係なプロセス間のデバイスファイルがあるとして、それは限りパスへのアクセスなど、あなたがFIFOからも通信することができ、それに関連付けられたパス名を提供します。FIFOは常にFIFO原理によれば、第1のデータが書き込まれている作業は、最初のパイプから読み出されます。
プロトタイプ:
#includeは<sys / types.h>に する#include <SYS / stat.h> INTはmkfifo(CONST のchar *パス、mode_tモード)。
モードは、そのアクセスを示す、モデル、名前付きパイプを作成するには、パスは、名前付きパイプのパス名が作成されています。関数呼び出しが成功した場合に返すために失敗を0に-1を返します。
名前付きパイプの存在を使用する前に、我々は開くように()のオープンを使用する必要があります。名前付きパイプは、ハードディスク上のファイルに存在し、かつパイプがあるので、特別なファイルがメモリに存在します。
次のプログラムは、無関係なプロセス間でどのように名前付きパイプ通信を示しています。
書き込み側:
する#include <stdio.hに> する#include <STDLIB.H> する#include < 文字列・H> の#include <fcntl.h> の#include <SYS / types.h>に する#include <SYS / stat.hで定義されている> の#define FIFO_NAME " myfifo " の#define buf_sizeの1024 int型メイン(無効) { int型 FD; char型 [buf_sizeの] = bufは" 私は名前のプロセスprocreadから来て、ハローprocwrite!" ; umask値(0 ); //は、名前付きパイプとアクセスを作成するために指定しました0666、つまり作成者、作成者と同じグループのユーザー、他のユーザーが名前付きパイプへのアクセスは読み取りおよび書き込み可能です場合 (はmkfifo(FIFO_NAME、S_IFIFO | 0666)== - 1 ) { perrorは(" はmkfifoエラー!" ); 出口(1 ); } IF((FD =オープン(FIFO_NAME、O_WRONLY))== - 1)/ * にFIFOの書き込みのためにオープン* / { perrorは(" !fopenのエラー" ); 出口(1。); } 書き込み(FD、bufが、strlenを(BUF) + 1。); / * 書き込みデータFIFOに* / (FD)を閉じる。 終了します(0); }
読む側:
書式#include <stdio.hに> する#include <stdlib.h>に含ま 書式#include <unistd.h> 書式#include <sysの/ stat.h> の#include <fcntl.h> の#include <SYS / types.h>にに#define FIFO_NAME " myfifo」 の#define BUF_SIZE 1024 INTメイン(ボイド) { int型 FD。 CHAR [BUF_SIZE] BUF。 umask(0 ); FD = オープン(FIFO_NAME、O_RDONLY)。 (FD、BUF、BUF_SIZE)を読み取ります。 printf(" コンテンツを読む:%sのを\ n " 、BUFを); 出口(0 ); }
これらは、パイプと名前付きパイプの基本的な使い方です。