ホームページ  >  記事  >  システムチュートリアル  >  Linux 名前付きパイプ (FIFO): プロセス間で通信するためのシンプルかつ強力な方法

Linux 名前付きパイプ (FIFO): プロセス間で通信するためのシンプルかつ強力な方法

WBOY
WBOY転載
2024-02-11 21:36:18791ブラウズ

Linux システムは、マルチタスクの同時実行をサポートするオペレーティング システムであり、複数のプロセスを同時に実行できるため、システムの使用率と効率が向上します。ただし、これらのプロセス間でデータ交換とコラボレーションが必要な場合は、シグナル、メッセージ キュー、共有メモリ、セマフォなどのプロセス間通信 (IPC) メソッドを使用する必要があります。その中でも有名なパイプ (FIFO) は、比較的シンプルで強力な IPC 方式であり、ファイルの内容や形式を気にすることなく、複数のプロセスがファイルを介してデータを送信できるようになります。この記事では、Linux システムにおける有名なパイプ (FIFO) のブロッキングおよびノンブロッキングの読み取りおよび書き込み方法 (有名なパイプの作成、オープン、読み取り、書き込み、クローズ、削除など) を紹介します。

Linux 名前付きパイプ (FIFO): プロセス間で通信するためのシンプルかつ強力な方法

//執筆プロセス

####含む ######### ####含む ######### ####含む ######### ####含む ######### ####含む ######### ####含む #########

#FIFO_NAME「/tmp/myfifo」を定義します ###主要()### {

int fd; char w_buf[50];

int w_num; // fifo がすでに存在する場合はそれを直接使用し、そうでない場合は作成します

if((mkfifo(FIFO_NAME,0777) {

printf(“FIFOを作成できません…\n”); 終了(1);

} //ブロッキング書き込み専用モードで FIFO を開く

fd=open(FIFO_NAME,O_WRONLY);

w_num=write(fd,”abcdg\0″,6);

printf(“%d\n”,w_num);

}

//読み取りプロセス

####含む ######### ####含む ######### ####含む ######### ####含む #########

#FIFO_NAME「/tmp/myfifo」を定義します

###主要()###

{

char r_buf[50];

int fd;

int r_num;

// fifo がすでに存在する場合はそれを直接使用し、そうでない場合は作成します

if((mkfifo(FIFO_NAME,0777)

{

printf(“FIFOを作成できません…\n”);

終了(1);

}

//ブロッキング読み取り専用モードで FIFO を開く fd=open(FIFO_NAME,O_RDONLY);

if(fd==-1) {

printf(“読み取りエラーのため %s を開きます\n”); 終了(1);

} // キーボードから文字列を入力し、「exit」が入力されるまでその文字列を FIFO に書き込みます。

r_num=read(fd,r_buf,6);

printf(" %d バイト読み取り:%s\n",r_num,r_buf);

unlink(FIFO_NAME);//fifoを削除

}

1. 書き込みプロセスと読み取りプロセスがブロックされます。

最初に書き込みプロセスを実行し (ブロックされ)、次に読み取りプロセスを実行します。すべて正常です。

最初に読み取りプロセスを実行し (ブロックされ)、次に書き込みプロセスを実行します。すべて正常です。

2. 書き込みプロセスはブロックされますが、読み取りプロセスはノンブロッキングです。

コード fd=open(FIFO_NAME,O_RDONLY | O_NONBLOCK) を次のように変更するだけです。

最初に書き込みプロセスを実行し (ブロックされ)、次に読み取りプロセスを実行します。すべて正常です。

最初に読み取りプロセスを実行すると、プログラムが直接クラッシュします (セグメンテーション違反 (コアダンプ))。考えてみれば、これはごく自然なことです。読むものは何もなく、待ちたくないのです。

3. 書き込みプロセスはノンブロッキングですが、読み取りプロセスはブロッキングです。

最初に書き込みプロセスを実行すると、open 呼び出しは -1 を返し、open は失敗します。

最初に読み取りプロセスを実行し (ブロックされ)、次に書き込みプロセスを実行します。すべて正常です。

4. 書き込みプロセスはノンブロッキングで、読み取りプロセスもノンブロッキングです。

実は上記2と3の半分ずつが取られているという異常事態です。

また、/tmp ディレクトリで ls -la コマンドを実行すると、パイプ ファイル myfifo のサイズが常に 0 であることがわかります。これは、FIFO ファイルがファイル システムに存在しても、FIFO の内容がメモリに保存されるため、ファイル サイズは常に 0 になります。

この記事では、Linux システムにおける有名なパイプ (FIFO) のブロッキングおよびノンブロッキングの読み取りおよび書き込み方法 (有名なパイプの作成、オープン、読み取り、書き込み、クローズ、削除など) を紹介します。この知識を理解して習得することで、有名なパイプ (FIFO) をより適切に使用してプロセス間通信を実装し、システムのパフォーマンスと信頼性を向上させることができます。もちろん、Linux システムには他にも有名なパイプ (FIFO) の機能や使用法が数多くあり、それらについては引き続き学習し、探索する必要があります。この記事があなたにインスピレーションと助けをもたらすことを願っています。

以上がLinux 名前付きパイプ (FIFO): プロセス間で通信するためのシンプルかつ強力な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。