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

推薦する

HTMLの空リンクの役割についての簡単な説明

空のリンク:つまり、ターゲット エンドポイントとのリンクはありません。フォーマット <a hr...

Vue が 4 レベルのナビゲーションと検証コードを実装する方法の例

効果: まず5つのVueインターフェースを作成する1.home.vueページ <テンプレート&...

HTML/XHTML における img 画像タグの基本的な使用法の詳細な説明

画像タグは、Web ページに画像を表示するために使用されます。 HTML/XHTML 画像 <...

MySQLでテーブルを作成し、フィールドコメントを追加する方法

コードと例を直接投稿する #テーブル作成時にコメントを記述する CREATE TABLE useri...

JS を使用して HTML で回転するクリスマスツリーを実装する

<!DOCTYPE ヘムル パブリック> <html> <ヘッド&g...

HTML CSS JS はタブページのサンプルコードを実装します

コードをコピーコードは次のとおりです。 <html xmlns="">...

CSS マージンの重複と解決策の探索の詳細な説明

最近、CSS 関連の知識ポイントをいくつか見直し、CSS における典型的なマージンの重なりの問題を整...

Mysql-connector-java ドライバのバージョン問題の概要

Mysql-connector-java ドライバのバージョンの問題私のデータベースのバージョンは ...

Docker クリーンアップ環境操作

丁寧に掃除を始めましょう!未使用ボリュームの一覧docker ボリューム ls -qf dangli...

MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

目次問題の説明解決問題分析問題の説明MySQL で delete ステートメントを使用してデータを削...

1 行のコードでさまざまな IE 互換性の問題を解決します (IE6-IE10)

x-ua-compatible は、IE ブラウザがページを解析およびコンパイルするためのモデルを...

MySQLのストレージエンジンの詳細な説明

MySQL ストレージ エンジンの概要ストレージ エンジンとは何ですか? MySQL のデータは、さ...

DPlayer.js ビデオ再生プラグインの使い方

DPlayer.jsビデオプレーヤープラグインは使いやすい主な用途: ビデオの再生、監視の開始、終了...

Centos 7.4 でリモート アクセス制御を実装する方法

1. SSHリモート管理SSH はセキュア チャネル プロトコルであり、主にリモート ログイン、リモ...

JSはシンプルなカウンターを実装します

HTML CSS および JavaScript を使用して、プラス、マイナス、ゼロの 3 つのボタン...