UDS (Unix Domain Socket)

什么是UDS

UDS 是一种本地进程间通信机制,通过文件系统路径作为访问端点,实现同一台机器上不同进程间的数据交换。

虽然表现为一个文件路径,但它不是普通文件。文件本身不存储数据,只是内核中 socket 资源的"门牌号"。

为什么需要UDS

对比项

网络Socket

UDS

通信范围

跨机器

本机

性能

较低(经过网络协议栈)

更高(内核直接拷贝)

安全性

需额外配置

可用文件权限控制

开销

TCP握手、校验和等

无协议开销

通信机制对比

进程间通信方式:管道、共享内存、消息队列、信号量、Socket
线程间通信:共享内存(同一进程内的线程天然共享地址空间)
网络间通信:TCP/UDP Socket

UDS 是"本地版的 Socket",API 与网络 Socket 一致,但更高效。

Python示例

# server.py - 服务端
import socket
import os

SOCKET_PATH = '/tmp/my_uds.sock'

# 清理可能存在的旧socket文件
if os.path.exists(SOCKET_PATH):
    os.unlink(SOCKET_PATH)

server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(SOCKET_PATH)
server.listen(1)
print('Server listening...')

conn, _ = server.accept()
data = conn.recv(1024)
print(f'Received: {data.decode()}')
conn.send(b'Hello from server!')
conn.close()
server.close()
os.unlink(SOCKET_PATH)
# client.py - 客户端
import socket

client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect('/tmp/my_uds.sock')
client.send(b'Hello from client!')
print(client.recv(1024).decode())
client.close()

创建与销毁:服务端调用 bind() 时创建,服务端退出时应删除 socket 文件。

总结

UDS 是高效的本机进程通信方式,以文件路径为端点,实际数据在内核中流转。适合需要本地高性能通信的场景(如 Docker、MySQL 本地连接)。