Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linux環境プログラミング - プロセス通信

Linux環境プログラミング - プロセス通信

  
 

実験的な内容

パイプライン通信を実装するプログラムを書いてください。パイプを作成するには、システムコールpipe()を使用します2つの子プロセスP1とP2がそれぞれのパイプに文を書きます:

子1がメッセージを送信中!

子2がメッセージを送信中!

親プロセスは子プロセスからパイプラインから2つの情報を読み出して表示します(最初にP1、次にP2を受け取る必要があります)。


実験的ガイダンス

1.パイプラインとは

OS開発におけるUNIXシステムの最も重要な貢献の1つは、システムの最初の取り組みです。パイプこれもUNIXシステムの大きな特徴です。

いわゆるパイプラインは、書き込みプロセスと読み取りプロセスに接続できる共有ファイルで、プロデューサコンシューマ方式で通信することを可能にします。これはパイプファイルとも呼ばれます。書き込みプロセスは、パイプラインの書き込み側(ハンドル1)からパイプラインにデータを書き込み、読み取りプロセスは、パイプラインの読み取り側(ハンドル0)からデータを読み取ります。


handle fd [0]





ハンドルfd [1]

リーダー





書き込み

2番目に、パイプラインのタイプ:

1、pipelineと名前が付けられます。システムコールmknod()で作成されました。匿名パイプの使用の制限を克服し、より多くのプロセスがパイプを使用して通信できるようにします。したがって、他のプロセスはその存在を知ることができ、ファイルにアクセスするためにパス名を使用できます。名前付きパイプへのアクセスは他のファイルへのアクセスと同じで、最初にopen()でオープンします。

2、匿名パイプ

一時ファイル。 pipe()で作成された名前のないファイル(パス名なし)。システムコールによって返されたファイルディスクリプタだけがファイルの識別に使用されるので、pipe()およびその子孫を呼び出すプロセスだけがファイル(pipe)と通信するためにファイルディスクリプタを認識できます。これらのプロセスがこのパイプラインを使用しなくなると、コアはそのインデックスノードを再利用します。

2つのパイプの読み方と書き方は同じですが、この記事では無名パイプについてのみ説明します。

3、パイプファイルの確立

ディスクとメモリのインデックスノードの割り当て、読み込みプロセスのファイルエントリの割り当て、書き込みプロセスのファイルエントリの割り当て、ユーザーファイル記述子の割り当て

4、読み取り/書き込み処理の相互排除

カーネルはアドレスに読み取りポインタと書き込みポインタを設定し、先入れ先出し順に読み書きを行います。

読み書きプロセスが相互に排他的な方法でパイプファイルにアクセスするには、各プロセスがパイプファイルのインデックスノード内の直接アドレスエントリに相互排他的にアクセスする必要があります。したがって、プロセスがパイプファイルにアクセスするたびに、インデックスファイルがロックされているかどうかを確認する必要があります。そうであれば、プロセスはスリープし、そうでなければそれはロックされ、読み書きされる。操作が終了したらロックを解除し、インデックスノードがロックされているためスリープしているプロセスを起動します。

3、関係するシステムコール

1、pipe()

無名パイプを作成します。

システムコールフォーマット

pipe(filedes)

パラメータの定義

int pipe(filedes);

int filedes [2];

ここで、filedes [1]は書き込み終了、filedes [0]は読み込み終了です。

この関数は次のようにヘッダーファイルを使用します。

#include< unistd.h>

#inlcude< signal.h>

#include<; stdio.h>

2、read()

システムコールフォーマット

read(fd、buf、nbyte)

機能:fdより指定されたファイルからnバイトのデータが読み取られ、ポインターbufによって示されるバッファーに送信されます。ファイルがロックされている場合は、ロックが開くまで待ちます。

パラメータの定義

int read(fd、buf、nbyte);

int fd;

char * buf;

unsigned Nbyte;

3、write()

システムコールフォーマット

read(fd、buf、nbyte)

function:nbyteバイトを置くデータは、bufが指すバッファからfdが指すファイルに書き込まれます。ファイルがロックされている場合は、ロックが解除されるまで書き込みは中断されます。

パラメータの定義はread()と同じです。




プロセスのパイプライン通信を実装するプログラムをコンパイルします。システムコールpipe()を使用してパイプラインを作成します。 2つの子プロセスp1とp2が文章をチャネルに書き込みます。

child1プロセスがメッセージを送信しています!

child2プロセスがメッセージを送信しています!

親プロセスはパイプラインからのものです。 2つのプロセスからの情報が読み出され、画面に表示されます。


プログラム1:
#include< unistd.h>#include< sys /types.h>#include< errno.h>#include< stdio.h>#include<; stdlib.h>#include< string.h> int main(){int pipe_fd [2]; pid_t pid; char buf_r [100]; char * p_wbuf; int r_num; memset(buf_r、0、sizeof(buf_r)); if(pipe(pipe_fd)< 0){printf(" pipe create error \\ n"); return -1;} if((pid = fork())== 0){printf(" \\ n"; )(close(pipe_fd [1]); sleep(2); if((r_num = read(pipe_fd [0]、buf_r、100))> 0){printf("%d個のパイプから読み取られた数は%) s \\ n"、r_num、buf_r);} close(pipe_fd [0]); exit(0);} else if(pid> 0){close(pipe_fd [0]); if(write(pipe_fd [1]、) “ Hello”、5)!= - 1)printf(“親ライター成功!\\ n”); if(write(pipe_fd [1]、“ pipe”、5)!= - 1)printf("親write2成功!\\ n"); close(pipe_fd [1]); sleep(3); waitpid(pid、NULL、0); exit(0);}}

Copyright © Windowsの知識 All Rights Reserved