UNIXドメインソケットとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > UNIXドメインソケットの意味・解説 

UNIXドメインソケット

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/02/09 02:53 UTC 版)

ソケット (BSD) > UNIXドメインソケット

UNIXドメインソケット: UNIX domain socket)は単一マシン上の高効率なプロセス間通信に用いられる機能・インタフェースの一種である[1]

プロセス間通信 (Inter-Process Communication: IPC) は一般的に名前付きパイプBSDソケットを利用したTCP通信などで実現できる。UNIXドメインソケットはBSDソケットの一種であり、単一マシン上でのプロセス間通信を目的としている。ソケット通信がもつ双方性・プロセスfork不要といった特徴を備えつつ、単一マシン上の通信である(=インターネットを介さない)ことを生かした高効率な通信を可能にしている。

UNIXドメインソケットは、アドレス・名前空間としてファイルシステムを使用している。具体的には、ソケットをファイルシステム内のinodeとして作成し、そのパス名をソケットのアドレスとする。これにより、2つのプロセスが通信するために、同じソケットを開くことができる。しかし、コミュニケーションは、完全にオペレーティングシステムのカーネル内で発生する。データを送ることに加えて、プロセスは、sendmsg()およびrecvmsg()システムコールを使用してUNIXドメインソケット接続を経由してファイル記述子を送信することができる。

POSIXはBSDソケットとしてUNIXドメインソケットインタフェースを提供している。BSDソケットのAF_UNIXprotocol familyがUNIXドメインソケットに相当する[1]。受け入れ可能なsocket typeはSOCK_STREAMSOCK_DGRAMSOCK_SEQPACKETの3種類である。

Go言語(の実行環境)では、Microsoft Windows上でもUNIXドメインソケットを使ったプログラムを動かすことができる。

特殊なUNIXドメインソケットとして、socketpair()を用いて作られるものがある。socketpair()はUNIXドメインソケットを2点作成し、一方のソケットに書き込んだデータがもう一方のソケットから読み出せる。パイプが一方通行の読み書きしかできないのに対し、socketpair()にて作成したソケットでは双方向通信が可能である。

利用方法

C言語

socket() 関数における第1引数の domain に AF_UNIX を指定する。第2引数の type は SOCK_STREAM, SOCK_DGRAM どちらも利用可能。そして、クライアント側の場合、その後 connect() を呼ぶ。

Java

以下のライブラリなどで利用可能。

また、JEP380によりJava 16よりjava.nio.channels.SocketChannelで利用可能[2]

Android

Android SDKに、Java/Kotlinから利用できる android.net.LocalSocket クラスが実装されている[3]

Mono

Mono.Unix.UnixClient クラスで利用可能。

PHP

URL を unix:// もしくは udg:// で始めることで利用可能。

ソースコード例

サーバ

C99 でのサーバ側のソースコード例は以下の通り。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

int main(void)
{
    // サーバーソケット作成
    int sock = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sock == -1)
    {
        perror("socket");
        return 1;
    }

    // struct sockaddr_un 作成
    struct sockaddr_un sa = {0};
    sa.sun_family = AF_UNIX;
    strcpy(sa.sun_path, "/tmp/unix-domain-socket");

    // 既に同一ファイルが存在していたら削除
    remove(sa.sun_path);

    // バインド
    if (bind(sock, (struct sockaddr*) &sa, sizeof(struct sockaddr_un)) == -1)
    {
        perror("bind");
        goto bail;
    }

    // リッスン
    if (listen(sock, 128) == -1)
    {
        perror("listen");
        goto bail;
    }

    while (1)
    {
        // クライアントの接続を待つ
        int fd = accept(sock, NULL, NULL);
        if (fd == -1)
        {
            perror("accept");
            goto bail;
        }

        // 受信
        char buffer[4096];
        int recv_size = read(fd, buffer, sizeof(buffer) - 1);
        if (recv_size == -1)
        {
            perror("read");
            close(fd);
            goto bail;
        }

        // 受信内容を表示
        buffer[recv_size] = '\0';
        printf("message: %s\n", buffer);

        // ソケットのクローズ
        if (close(fd) == -1)
        {
            perror("close");
            goto bail;
        }
    }

bail:
    // エラーが発生した場合の処理
    close(sock);
    return 1;
}

クライアント

C99 でのクライアント側のソースコード例は以下の通り。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#define MESSAGE "Hello World!"

int main(void)
{
    // ソケット作成
    int sock = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sock == -1)
    {
        perror("socket");
        return 1;
    }

    // struct sockaddr_un 作成
    struct sockaddr_un sa = {0};
    sa.sun_family = AF_UNIX;
    strcpy(sa.sun_path, "/tmp/unix-domain-socket");

    // 接続
    if (connect(sock, (struct sockaddr*) &sa, sizeof(struct sockaddr_un)) == -1)
    {
        perror("connect");
        goto bail;
    }

    // 送信
    if (write(sock, MESSAGE, strlen(MESSAGE)) == -1)
    {
        perror("write");
        goto bail;
    }

    // クローズ
    close(sock);
    return 0;
 
bail:
    // エラーが発生した場合の処理
    close(sock);
    return 1;
}

実装

Linux

LinuxカーネルにBSDソケット AF_UNIXprotocol 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が可能となっている。

制限事項

UNIXドメインソケットのアドレスとしてはそのパス名を用いるが、その最大長は概ね100バイト強に限られ、かつUNIXドメインソケットの実装に依存する。[4][5] これは、パス名一般の最大長よりも短い。この制限は、BSDによる初期の実装においてアドレスを格納する構造体struct sockaddr_unをmbuf[6]を用いて確保しており、そのメモリサイズが128バイトに固定されていたことに起因している。その後、実装変更により他のOSへの移植を含め、ネットワークスタック内部での制限は解消されたが、互換性のためにAPI上のアドレス最大長制限は残されている。

脚注

  1. ^ a b The AF_UNIX (also known as AF_LOCAL) socket family is used to communicate between processes on the same machine efficiently. UNIX(7)
  2. ^ JEP 380 2021年9月25日観覧
  3. ^ LocalSocket | Android Developers
  4. ^ un.h - GitHub FreeBSD 14.2-RELEASEにおけるstruct sockaddr_unの実装。アドレスは最大104バイト。
  5. ^ un.h - GitHub Linuxカーネル6.13におけるstruct sockaddr_unの実装。アドレスは最大108バイト。
  6. ^ BSDにおけるネットワークスタック向けメモリアロケータ。

関連項目

外部リンク


UNIXドメインソケット

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/04/03 08:34 UTC 版)

ソケット (BSD)」の記事における「UNIXドメインソケット」の解説

詳細は「UNIXドメインソケット」を参照 IP場合IP アドレスポート番号接続先を指定するに対して、UNIXドメインソケットの場合ファイルパス指定する

※この「UNIXドメインソケット」の解説は、「ソケット (BSD)」の解説の一部です。
「UNIXドメインソケット」を含む「ソケット (BSD)」の記事については、「ソケット (BSD)」の概要を参照ください。

ウィキペディア小見出し辞書の「UNIXドメインソケット」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「UNIXドメインソケット」の関連用語

UNIXドメインソケットのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



UNIXドメインソケットのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのUNIXドメインソケット (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのソケット (BSD) (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS