%20%E3%81%8C%20ipcs%20%E3%81%AB%E3%83%AA%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82.png)
Linux の共有メモリについて調べていたところ、偶然このipcs
コマンドを見つけました。
man ページから:
ipcs - provide information on ipc facilities
ipc
マニュアル ページでは説明されていませんが、これはおそらくプロセス間通信を意味します。また、共有メモリ セグメント、メッセージ キュー、セマフォ配列などのリストされている情報のコンテキストからも、これは意味をなします。
Linux/Unix のすべてが「ファイル」、または少なくともファイルのようなオブジェクトであるため、 にリストされている要素の「ファイル」はどこにあるのだろうかと思いましたipcs
。
によって作成された名前付きパイプmkfifo
が にリストされていないのipcs
はなぜですか? 私の理解では、FIFO はキューです。 によって作成された名前付きパイプは、mkfifo
によって作成されたメッセージ キューとどう違うのですかipcmk
?
答え1
ここでいくつか質問があります:
- ipcs にリストされている要素のファイルはどこにありますか?
状況によります。キューは仮想ファイルシステムで表示されます。mq_overview(7) より:
Mounting the message queue file system
On Linux, message queues are created in a virtual file system. (Other implementations may also provide such a feature, but
the details are likely to differ.) This file system can be mounted (by the superuser) using the following commands:
# mkdir /dev/mqueue
# mount -t mqueue none /dev/mqueue
共有メモリ (shm_overview(7))
Accessing shared memory objects via the file system
On Linux, shared memory objects are created in a (tmpfs) virtual file system, normally mounted under /dev/shm. Since kernel
2.6.19, Linux supports the use of access control lists (ACLs) to control the permissions of objects in the virtual file sys-
tem.
セマフォ (sem_overview(7))
Accessing named semaphores via the file system
On Linux, named semaphores are created in a virtual file system, normally mounted under /dev/shm, with names of the form
sem.somename. (This is the reason that semaphore names are limited to NAME_MAX-4 rather than NAME_MAX characters.)
Since Linux 2.6.19, ACLs can be placed on files under this directory, to control object permissions on a per-user and per-
group basis.
- によって作成された名前付きパイプが
mkfifo
にリストされていないのはなぜですかipcs
?
それについてはよく分かりませんので、回答ではなく、私の意見だけを述べます。私の仮説は、ソケットのように実際のファイル システムに存在するため、カーネルが共有メモリ セグメントやメッセージ キューを管理するのと同じ方法では管理されないということです。
- mkfifo によって作成された名前付きパイプは、ipcmk によって作成されたメッセージ キューとどう違うのでしょうか?
パイプとメッセージ キューの主な違いは、パイプは 2 つのプロセス間の通信チャネルにすぎないことです。パイプはバイト レベルで機能します。必要な方法で読み書きできますが、通信プロトコルを設計する必要があります。これらは厳密な FIFO です。つまり、あるバイトが別のバイトより先に書き込まれると、もう一方の端では常に先に読み取られます。メッセージ キューは、バイトではなくメッセージを扱います。通常、これらは厳密な FIFO ではありません。実装によって異なりますが、メッセージ間の優先順位のメカニズムをサポートできます。
ある意味では、メッセージ キューはより多くの機能を提供しますが、必要に応じて、メッセージ キューで FIFO を実装することも、その逆も可能です。
答え2
ipcs
「System V IPC」と呼ばれるプロセス間通信方式を見ることができます。System V IPCは現在広く無視されていますが、過去には明らかに嫌われていた初期の頃は、さまざまなグループがそれぞれ必要なものを実装し、メッセージ キュー、共有メモリ、セマフォが必要な人もいました。。
これらの IPC メソッドは、あまり Unix 的ではない、つまり「ファイル」ではないという理由で広く批判されてきました。これは、あなたが疑問に思っていることと同じです。
名前付きパイプとメッセージ キューが統合されていない理由については説明できませんが、おそらく同じ理由から始まったのでしょう。つまり、あるグループが名前付きパイプを希望したので、それを実装したのです。