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はショッピングカート機能を実装します

推薦する

div 要素に終了タグがないため、Web ページを開くことができません

最初は速度の問題だと思ったので、その後、すべての画像リンク リクエストをクロスサイト接続ではなくサイ...

ウェブページの読み込み速度を上げる25の方法とヒント

はじめに<br />誰もが高速インターネット接続にアクセスできるわけではありません。たと...

MySQL はどのようにしてデータの整合性を確保するのでしょうか?

オンライン ビジネスにとってデータの一貫性と整合性が重要であることは明らかです。データが失われないよ...

Vueはページキャッシュ機能を実装する

この記事の例では、ページキャッシュ機能を実装するためのVueの具体的なコードを参考までに共有していま...

シャトルボックス機能を実装するためのVueの詳細なコード

Vue - シャトルボックス機能を実装します。効果図は次のようになります。 CS 。移行{ ディスプ...

標準SQL更新ステートメントの3つの用途についての簡単な理解

1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...

Bootstrap FileInputは画像アップロード機能を実装します

この記事の例では、Bootstrap FileInputの具体的なコードを共有して、画像アップロード...

VUE + OPENLAYERSがリアルタイムポジショニング機能を実現

目次序文1. ラベルスタイルを定義する2. GeoJSONデータのシミュレーション3. Vercto...

CocosCreatorでスワイプした位置にテクスチャを表示する方法

目次1. プロジェクト要件2. 文書の内容3. プロジェクト例4. プロジェクトコード1. プロジェ...

Linux での mysql および mysql.sock のインストールに関する問題

最近、Linux に Aphace、mysql、php をインストールするときに多くの問題に遭遇しま...

vue 要素 el-transfer にドラッグ機能を追加

コア資産管理プロジェクトでは、el-transfer にドラッグ アンド ドロップによる並べ替えと、...

Linuxサーバーのディスク容量を拡張する方法

目次序文ステップ序文今日、es ログが記録されていないことに気付きました。filebeat、elas...

MySQL 8.0.23 インストールの超詳細なチュートリアル

目次序文1. 公式サイトからMySQLをダウンロードする2. 解凍ファイルを設定する3. 初期化4....

Vueはmockjsを使用してシミュレートされたデータケースの詳細を生成します

目次プロジェクトにmockjsをインストールするVueプロジェクトでmockjsを使用する基本的なプ...

MySQL の一般的な問題とアプリケーション スキルの概要

序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...