プロセス間通信(IPC)は、各ユーザのアドレス空間(仮想アドレス空間)のための別のプロセスをそれぞれ有する異なるプロセス間でのデータの普及と交換を指し、別のプロセスの任意のグローバル変数の処理は、そう、見ることができませんでしたカーネルバッファを開き、プロセス間でデータをコアとすることができる交換するために、プロセスカーネルバッファへのユーザスペースからのコピーデータは、カーネルによって提供されるユーザ空間を所有するプロセスBカーネルバッファからデータをコピーこれは、プロセス間通信機構と呼ばれ、LinuxのIPC機構の下に分割される:パイプ、セマフォ、共有メモリ、メッセージキュー、ソケット。
まず、パイプライン
1つの思考:カーネルにパイプ機能を呼び出すと、読み出し側と書き込み側が含まれているバッファファイルと呼ばれるパイプを開きます、プロセス間の緩衝地帯を介して通信することができます。
2つの特徴:半フォーム、親と子、同期メカニズムが付属しています。
シンタックス3:親[2]、[0]可読FD、[1]を書き込むことができるfdが2つのファイルディスクリプタfdを取得するために、導管を呼び出す作成し、子プロセスを親プロセスをフォークし、子プロセスも与えるために、2つに記載されていますFU [2] fdが、親が読み出し終了FD [0]を閉じ、子供が書き込み終了FDを閉じるパイプに親プロセスがデータを書き込むように[1]、パイプからデータを読み取るための子プロセスは、パイプは、円形キュー実装されています、読み取り端から流入、流出端からの書き込みデータは、以下:
(1)パイプラインは、パイプラインへの書き込みの書き込み、書き込みデータの最後まで空きブロックである場合、パイプラインを読み、0が返された場合側が閉鎖され、書き込み、
、-1のリードエラーが返された場合の端部が閉じられた信号SIGPIPEを生成し、パイプラインは、内側が除去読み取りデータパイプラインの読み出し終了までブロック、満杯である場合(2)、パイプラインを書き込みます。
次のように4コードが実装されています。
1の#include <stdio.hの> 2の#include <unistd.h> 3の#include < 文字列・H> 4 5 の#define ABCDE "ABCDE" 6 の#define FGHIJ "FGHIJ" 7 8 INTメイン(int型 ARGC、チャー *のARGV []) 9 { 10 INT FD [ 2 ] = { 0 }、サイズ= 0 。 11 pid_t PID = - 1 。 12 チャー BUF [ 256 ] = { 0 }。 13 14 であれば(パイプ(FD))// 1パイプ 15 { 16 (perrorは" パイプ" )。 17 リターン 1 。 18 } 19 PID =フォーク()。// 2フォーク 20 であれば(PID < 0 ) 21 { 22 (perrorは" フォーク" )。 23 リターン 2 。 24 } 25 そう であれば(PIDの== 0)//3子書き込みFD [1] 26 { 27 のprintf(" 子開始する\ n " ); 28 近い(FD [ 0 ])。 29 サイズ=ライト(FD [ 1 ]、ABCDE、5 )。 30 のprintf(" 子、MSG =%S、サイズ=%d個の\ n " 、ABCDE、サイズ)。 31 // 睡眠(1)。 32 サイズ=ライト(FD [ 1 ]、FGHIJ、5 )。 33 のprintf(" 子、MSG =%S、サイズ=%d個の\ n " 、FGHIJ、サイズ)。 34 } 35 他 // 3父[0] FDを読み込む 36 { 37 のprintf(" 父開始する\ n " ); 38 近い(FD [ 1 ])。 39 // 睡眠(1); 40 読み取りサイズ=(FD [ 0 ]、BUF、256)。 // [1] FDに子書き込みまでブロック 41 のprintf(" 父、MSG =%S、サイズ=%d個の\ n " 、BUF、サイズ)。 42 のmemset(BUF、0、はsizeof (BUF))。 43 サイズ=読み取る(FD [ 0]、BUF、256)。 // [1] FDに子書き込みまでブロック 44 のprintf(" 父、MSG =%S、サイズ=%d個の\ n " 、BUF、サイズ)。 45 } 46 リターン 0 。 47 }
II。