Linuxプロセス通信におけるFIFOの実装

Linuxプロセス通信におけるFIFOの実装

FIFO通信(先入れ先出し)

関連のないプロセス間の通信を可能にする FIFO 名前付きパイプ。

  • パイプの疑似ファイルを作成する
    • a. mkfifoを使用してtestfifoコマンドを作成する
    • b. 関数 int mkfifo(const char *pathname, mode_t mode); を使用することもできます。
  • カーネルは fifo ファイル用のバッファを開き、fifo ファイルを操作します。バッファを操作してプロセス間通信を実現できます。実際には、ファイルの読み書きです。

男3 mkfifo

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *パス名、mode_t モード);

注記:

FIFO
FIFOの読み取り側または書き込み側を開くと、もう一方の側も(別のプロセスまたはスレッドによって)開かれるまでブロックされます。
詳細についてはfifo(7)を参照してください。

fifo ファイルを開くと、読み取り側は書き込み側が開くのを待ってブロックされ、書き込み側も別の側が開くのを待ってブロックされます。

コード例:
file_w.c 書き込み終了

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <文字列.h>

int main(int argc, char *argv[]) {
  引数が2の場合
    printf("./a.out ファイル名1\n");
    -1 を返します。
  }
  printf("w\n を開いて開始");
  int o_ret = open(argv[1], O_WRONLY);
  printf("w\n のオープン終了");
  char buf[256];
  整数 = 0;
  一方(1){
    memset(buf, '\0', sizeof(buf));
    sprintf(buf, "xiaoming--%d", num++);
    printf("strlen(buf) = %d\n", strlen(buf));
    書き込み(o_ret、buf、strlen(buf));
    睡眠(1);
  }
  閉じる(o_ret);
  0を返します。
}
 

file_r.c 読み取り側

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <文字列.h>

int main(int argc, char *argv[]) {
  引数が2の場合
    printf("./a.out ファイル名1\n");
    -1 を返します。
  }
  printf("r をオープンし始める\n");
  int o_ret = open(argv[1], O_RDONLY);
  printf("open r の終了\n");
  char buf[256];
  整数 = 0;
  一方(1){
    memset(buf, '\0', sizeof(buf));
    読み取り(o_ret、buf、sizeof(buf));
    printf("strlen(buf) = %d\n", strlen(buf));
    printf("読み取りは%s\n", buf);
  }
  閉じる(o_ret);
  0を返します。
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 匿名パイプ経由の Linux プロセス間通信
  • Linux プロセス間通信方式ソケットの使用例
  • Linux のプロセス間通信方式とその長所と短所についての簡単な説明
  • Linuxのプロセス間通信のメッセージキュー実装の詳細な説明
  • Linux プロセス間通信 - シグナルの使用
  • Linux プロセス間通信 - ストリーム ソケットの使用
  • Linux のプロセス間通信の詳細説明 - セマフォの使用
  • Linux のプロセス間通信の詳細説明 - 共有メモリの使用
  • プロセス間通信に関する Linux アプレット

<<:  MySQL ルートパスワードを変更する 4 つの方法 (要約)

>>:  jQueryはショッピングカート機能を実装します

推薦する

MySQL と Golan 間の従来の分散トランザクションのための 7 つのソリューション

目次1. 基本理論1.1 取引1.2 分散トランザクション2. 分散トランザクションソリューション2...

DockerにRocketMQをインストールするための実装手順

目次1. 画像を取得する2. ブローカーサーバーを作成する3. ブローカーを作成する4. Rocke...

Nginx URL 書き換えメカニズムの原理と使用例

URL 書き換えは、Web サイトの優先ドメインを決定するのに役立ちます。同じリソース ページの複数...

CSS3 で翻訳効果 (transfrom: translate) を実装する例

移動を実現するためにtranslateパラメータを使用しますtranslateX: X 軸に沿って移...

スキニングを実現するネイティブJavaScript

ネイティブJavaScriptでスキニングを実装するための具体的なコードは参考までに。具体的な内容は...

CSS3は光る境界線効果を実現します

操作効果: html <!-- この要素は表示されません。DOM は JavaScript に...

MySQL 8.0.15 インストール グラフィック チュートリアルとデータベースの基礎

MySQLソフトウェアのインストールとデータベースの基礎は参考用です。具体的な内容は次のとおりです。...

HTML ハイパーリンクの詳細な説明

ハイパーリンクハイパーリンクは、Web サイト上のすべてのページがハイパーリンクで接続され、ページ間...

Dockerを使用して外部からアクセス可能なMySQLを構築する詳細な説明

MySQL 8.0をインストールする docker run -p 63306:3306 -e MYS...

Zabbixを介してデータベース接続情報といくつかの拡張機能をすばやく取得します

背景アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッ...

vue cli で env を使用するガイド

目次序文紹介-公式設定例序文vueCli を使用してプロジェクトを開発したことのある方は、少しがっか...

ハイパーリンクに関するいくつかの質問

ポテトチップスパーティーのこのエピソードに参加して、何人かの友人に会えてとても嬉しいです。思いがけず...

React でカレンダー コンポーネントを構築するためのステップ バイ ステップ ガイド

目次事業背景テクノロジーの活用技術的な問題デザインのアイデア😱 困惑と苦痛に満ちた顔🙄考え始める🌲デ...

Vueはechartを使用してラベルと色をカスタマイズします

この記事では、参考までに、echartを使用してタグと色をカスタマイズするVueの具体的なコードを紹...

MySQL フルテキスト検索の中国語ソリューションとサンプルコード

MySQL 全文検索中国語ソリューション最近、会社のプロジェクトで、データベースで中国語を検索する機...