Unix域套接字是Linux中基于文件系统路径的高效本地IPC机制,不经过网络协议栈,支持流式和数据报模式,需注意路径绑定、权限设置及残留文件清理。

Socket文件(也叫Unix域套接字,Unix Domain Socket)是Linux中一种高效的本地进程间通信(IPC)机制,它通过文件系统路径标识通信端点,不经过网络协议栈,比TCP/IP本地回环更轻量、更安全。
Socket文件的核心特点
Unix域套接字以文件形式存在于文件系统(如/tmp/mysock),但本质不是普通文件——它没有内容,不能用cat读取,而是内核维护的通信通道。其地址类型为AF_UNIX,支持流式(SOCK_STREAM)和数据报(SOCK_DGRAM)两种模式,前者类似TCP,保证有序可靠;后者类似UDP,无连接、轻量但不保证送达。
创建与使用Socket文件的典型流程
服务端需先绑定路径并监听,客户端通过同一路径连接。关键步骤包括:
- 调用
socket(AF_UNIX, SOCK_STREAM, 0)创建套接字 - 准备
struct sockaddr_un结构体,设置sun_family = AF_UNIX,并填充sun_path(路径长度建议不超过108字节) - 服务端调用
bind()绑定路径,注意提前unlink()旧socket文件避免“Address already in use”错误 - 服务端调用
listen(),客户端调用connect()完成握手 - 后续用
read()/write()或send()/recv()收发数据
权限与生命周期管理
Socket文件默认继承进程umask,可通过chmod()显式设权(如0600仅属主可访问),适合多用户环境下的安全隔离。文件本身在bind()时由内核创建,进程退出后不会自动删除;若服务异常终止,残留socket文件会阻塞重启,因此健壮的服务应在启动时检查并清理旧路径。也可使用抽象命名空间(Linux特有,sun_path[0] = '\0')避免占用文件系统,但该方式不可被ls查看,调试稍不便。
常见工具与调试方法
可用ss -xln列出所有监听中的Unix域套接字,lsof -U查看哪些进程打开了哪些socket文件。若连接失败,先确认路径是否存在、权限是否正确、服务端是否已运行并完成listen()。临时测试可用nc -U /path/to/socket(netcat)作为客户端交互收发。










