UNIXドメインソケット(英: UNIX domain socket)は単一マシン上の高効率なプロセス間通信に用いられる機能・インタフェースの一種である。
プロセス間通信 (Inter-Process Communication: IPC) は一般的に名前付きパイプやBSDソケットを利用したTCP通信などで実現できる。UNIXドメインソケットはBSDソケットの一種であり、単一マシン上でのプロセス間通信を目的としている。ソケット通信がもつ双方性・プロセスfork不要といった特徴を備えつつ、単一マシン上の通信である(=インターネットを介さない)ことを生かした高効率な通信を可能にしている。
UNIXドメインソケットは、アドレス・名前空間としてファイルシステムを使用している。これらは、ファイルシステム内のinodeとしてプロセスから参照される。これは、2つのプロセスが通信するために、同じソケットを開くことができる。しかし、コミュニケーションは、完全にオペレーティングシステムのカーネル内で発生する。データを送ることに加えて、プロセスは、sendmsg()
およびrecvmsg()
システムコールを使用してUNIXドメインソケット接続を経由してファイル記述子を送信することができる。
POSIXはBSDソケットとしてUNIXドメインソケットインタフェースを提供している。BSDソケットのAF_UNIX
protocol familyがUNIXドメインソケットに相当する。受け入れ可能なsocket typeはSOCK_STREAM
・SOCK_DGRAM
・SOCK_SEQPACKET
の3種類である。
Go言語(の実行環境)では、Microsoft Windows上でもUNIXドメインソケットを使ったプログラムを動かすことができる。
特殊なUNIXドメインソケットとして、socketpair()
を用いて作られるものがある。socketpair()
はUNIXドメインソケットを2点作成し、一方のソケットに書き込んだデータがもう一方のソケットから読み出せる。パイプが一方通行の読み書きしかできないのに対し、socketpair()
にて作成したソケットでは双方向通信が可能である。
socket()
関数における第1引数の domain に AF_UNIX
を指定する。第2引数の type は SOCK_STREAM
, SOCK_DGRAM
どちらも利用可能。そして、クライアント側の場合、その後 connect()
を呼ぶ。
以下のライブラリなどで利用可能。
また、JEP380によりJava 16よりjava.nio.channels.SocketChannel
で利用可能
Android SDKに、Java/Kotlinから利用できる android.net.LocalSocket
クラスが実装されている。
Mono.Unix.UnixClient
クラスで利用可能。
URL を unix:// もしくは udg:// で始めることで利用可能。
C99 でのサーバ側のソースコード例は以下の通り。
C99 でのクライアント側のソースコード例は以下の通り。
LinuxカーネルにBSDソケット AF_UNIX
protocol familyとして実装されている。SOCKET(2)をはじめとするシステムコールをAPIとして公開している。
LinuxにおけるUNIXドメインソケットは、バッファ(メモリ)への書き込みと読み込みという非常にシンプルな仕組みで実装されている。
Linuxカーネルのlinux/net/unix/af_unix.c
(GitHub mirror) に実装される。SOCK_STREAM
の場合、カーネル内部ではソケットバッファへのメッセージコピー・peerがもつsk_receive_queue
のtail、受信側のsk_data_ready
呼び出し、を繰り返すことでデータを転送する。
UNIXドメインソケットは単一マシン上のIPCが前提である。ゆえにTCPのようなプロトコルスイートは不要であり、プロトコルの重層が生むデータの入れ子構造を持たない。またネットワークに由来するパケットロスや到達順序保証の対応も必要ないため、バッファのread/writeというシンプルな仕組みで実装されている。結果として高効率なIPCが可能となっている。
socketpair
– The Open Group基本仕様書第7号2018年版「システムインターフェース」sendmsg
– The Open Group基本仕様書第7号2018年版「システムインターフェース」recvmsg
– The Open Group基本仕様書第7号2018年版「システムインターフェース」cmsg(3)
– JM Project Linux Library Functions マニュアルOwlapps.net - since 2012 - Les chouettes applications du hibou