FIFO、パイプ、およびUnixドメインソケットはLinuxカーネルで同じですか?

FIFO、パイプ、およびUnixドメインソケットはLinuxカーネルで同じですか?

FIFOという名前がパイプだと聞きました。そしてそれらはまったく同じ意味を持っています。一方、Unixドメインソケットはパイプに非常に似ていると思います(使用したことはありませんが)。だから、どちらもLinuxカーネルで同じ実装を参照しているのだろうか?どんなアイデアがありますか?

答え1

UNIXドメインソケットとFIFOは実装の一部を共有できますが、概念的には非常に異なります。 FIFOは非常に低いレベルで動作します。あるプロセスはパイプにバイトを書き込み、もう一方のプロセスはパイプからバイトを読み込みます。 UNIXドメインソケットは、TCP / IPまたはUDP / IPソケットと同様に動作します。

ソケットは双方向であり、多くのプロセスで同時に使用できます。プロセスは同じソケットで複数の接続を許可し、複数のクライアントを同時に処理できます。カーネルは毎回新しいファイル記述子を渡すconnect(2)か、accept(2)ソケットから呼び出されます。パケットは常に正しいプロセスに移動します。
FIFOではこれは不可能です。双方向通信には2つのFIFOが必要で、各クライアントには1対のFIFOが必要です。書き込みや読み取りはより原始的な形式のコミュニケーションであるため、選択的に書き込む方法はありません。

匿名パイプはFIFOと非常によく似ています。違いは、匿名パイプはファイルシステムにファイルとして存在しないため、どのプロセスもそうすることopen(2)ができないことです。他の方法で共有するプロセスで使用されます。プロセスがパイプを作成してaを実行すると、その子プロセスfork(2)はパイプを含むファイル記述子を継承します。 (名前付きパイプ/FIFOのファイル記述子も同じ方法で渡すことができます。)

UNIX ドメインソケット、匿名パイプ、および FIFO は、カーネル処理システムの呼び出しとメカニズムの抽象化とともに、ファイル記述子を使用してプロセス間通信を提供するという点で似ています。

答え2

ここに良い議論があります。http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos

私が知っている限り(プレゼンテーションスライドまたはソースの1つ)http://lxr.free-electrons.com/source/fs/pipe.c) FIFOはパイプの周りのラッパーとして実装され、それ自体はpipefs仮想ファイルシステムを介して実装されます。

@lgeorget - パイプは、(「共有メモリ」ではなく)リーダとライタの間のバッファとしてカーネルメモリを使用しているように見えpipe_readますpipe_iov_copy_to_user。、これはいくつかのASM実装の1つです。__copy_to_user_inatomiccopy_to_user__copy_to_user_inatomiccopy_user_generic

答え3

「先入選出」と「名前付き「パイプ」は同じです。しかし、シェルがコマンドラインの2つのコマンド間で「パイプ」(|)を処理する方法とはかなり異なります。

名前付きパイプ(FIFO)は、2つのプログラムが共有する単一の「ファイル」です。あるプログラムはここに書き、もう一方のプログラムは読みます。一方、ソケットは2つの「ファイル」の間にあります。 - これはネットワークを使用し、他のコンピュータにあるかもしれません。 1つのプログラムは1つの「ファイル」を読み書きすることであり、もう1つは別の「ファイル」を読み書きすることです...また、ハンドソケットと名前付きパイプの両方がinodeを使用し、すべていくつかの共通機能(読み取りと書き込みなど)を実装します。

答え4

私の2セント... FIFOとUNIXソケットは両方とも双方向(類似)ですが、ソケットにはスタートポロジがありますが、FIFOはキューにすぎません(交換できません)。実装は内部でコードを共有できます。

**

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDWR);   //so that you can read/write to it
 ...
write(fd, buff1, sizeof(buff1));  
getchar();//wait till some one reds this and writes something else
int sz=read(fd, buff1, sizeof(buff1));  //read that something**

関連情報