差分

プロセス間通信

306 バイト追加, 2021年4月29日 (木) 15:05
/* UNIXドメインソケット (ローカルIPC) */
その前にパイプを説明しましょう。コマンドラインでのシェルが持つパイプは、前のコマンドの標準出力を後ろのコマンドの標準入力にするというものです。使い勝手は、まるっきりファイルです。
  現在のディレクトリにあるファイル数をカウントする<pre class="bash">
% ls | wc
</pre>
名前付きパイプのファイルを作る
<pre class="bash">
$ mkfifo np
$ ls -l np
$ ls -F np
np|
</pre>
この状態で2つのshellウインドウを開いてみてください。一つはnpを読む、もう一つではnpに書き込むことをしてみます。
shellウインドウ1<pre class="bash">
$ cat np
abcdef <-- 表示される
123456 <-- 表示される
$ <-- 終了する
</pre> shellウインドウ2<pre class="bash">
$ cat > np
abcdef <--入力
^D <-- ^Dで終了
$
</pre>
ここでは判りやすいように一方向にデータを送っている例を出していますが、このようにファイル名でアクセスするようにしてプロセス間の通信が出来るというのは、実にUNIXらしいやり方です。プログラム中から名前つきパイプを作る時はユーザ関数 mkfifo(3)で作れます。
これはTCP/IPネットワーク接続の機能のインタフェースと同じものを用意して、しかし、データはローカルなプロセス間通信に使おうというものです。元々はUNIXドメインソケットと呼んでいたのですが、Posix ではUNIXに依存しないのでローカルIPC という呼び方をしています。しかし、その呼ばれ方はあまりにも知られていないので、カッコつきでIPネットワーク接続の機能のインタフェースと同じものを用意して、しかし、データはローカルなプロセス間通信に使おうというものです。元々はUNIXドメインソケットという形でBSD 4.xに組み込まれましたが、Posix はUNIXに依存しないのでローカルIPC という呼び方をしています。しかし、少なくとも筆者の知っている範囲のUNIXユーザはUNIXドメインソケットと読んでいるので、カッコつきで(UNIXドメインソケットローカルIPC)と並べて置きました。としました。
socket(2)、bind(2)、accept(2)のようにTCP/IPの通信を行うやり方は、今までのUNIXとはセマンティクス(意味的なもの)が違います。UNIXが、すべてを名前つきパイプのように名前空間でアクセスしようとするのに対して、TCPIPの通信を行うやり方は、TCP/IPが現れる以前のUNIXとはセマンティクス(意味的なもの)が違います。UNIXが、すべてを名前空間でアクセスしようとするのに対して、TCP/IP のような通信系のやり方は、一々、IPアドレスやポート番号を指定しなければいけません。
ログを出力するデバイスのように見せかけているソケット
<pre class="bash">
$ ls -lF /dev/log
srw-rw-rw- 1 root root 0 Aug 23 14:13 /dev/log=
</pre>
かな漢字サーバWnnのソケットをcatで見てみる<pre class="bash">
$ ls -lF /tmp/jd_sockV4
srwxr-xr-x 1 wnn nogroup 0 Sep 21 13:48 /tmp/jd_sockV4=
$ cat /tmp/jd_sockV4
cat: /tmp/jd_sockV4: No such device or address
</pre>
これらはIPスタックを経由しません。IPは複数の独立したホストがあり、ネットワーク構築された世界をIPパケットが中継されていくモデルです。そのためにIPパケットを処理するためには、そのための処理がなされます。一方、UNIXドメインソケットには、そんな付加する情報をつけたり処理したりする必要はありません。よって高速に処理することが可能になります。
これらはIPスタックを経由しません。IPは複数の独立したホストがあり、ネットワーク構築された世界をIPパケットが中継されていくモデルです。そのためにIPパケットを処理するためには、そのための処理がなされます。一方、UNIXドメインソケットには、そんな付加する情報をつけたり処理したりする必要はありません。よって高速に処理することが可能になります。
== 脚注 ==