Linux 开发:如何使用 Unix Domain Socket 进行进程间通信

发布时间 - 2025-11-19 00:00:00    点击率:
Unix Domain Socket(UDS)是一种高效的本地进程间通信机制,使用AF_UNIX地址族和socket API实现。首先创建套接字并绑定到本地路径,服务端调用listen()、accept()等待连接,客户端调用connect()连接该路径,随后通过read()/write()或send()/recv()传输数据,通信完成后关闭套接字并unlink()清理文件。支持SOCK_STREAM和SOCK_DGRAM两种模式,且可通过sendmsg()/recvmsg()传递文件描述符,适用于共享资源场景。需注意路径权限、唯一性及程序退出时的文件清理,避免绑定冲突。掌握这些步骤和细节即可稳定实现高性能本地IPC。

在 Linux 系统中,Unix Domain Socket(UDS)是一种高效的进程间通信(IPC)机制,适用于同一台主机上的进程交换数据。相比网络套接字,它避免了网络协议开销,性能更高,且支持传输文件描述符等高级功能。下面介绍如何使用 Unix Domain Socket 进行进程间通信。

创建 Unix Domain Socket

Unix Domain Socket 使用 socket API 创建,与 TCP 套接字类似,但地址族为 AF_UNIX。它有两种传输类型:流式(SOCK_STREAM)和报文式(SOCK_DGRAM),分别对应可靠的字节流和消息包。

基本步骤如下:

1. 调用 socket() 创建套接字,指定 AF_UNIX 和 SOCK_STREAM 或 SOCK_DGRAM。
2. 绑定到一个本地路径(如 /tmp/mysocket),使用 bind() 函数。
3. 服务端调用 listen() 接收连接(仅流式),客户端则 connect() 到该路径。
4. 使用 send()/recv() 或 read()/write() 传输数据。
5. 通信完成后关闭套接字并清理 socket 文件。

注意:bind() 成功后会创建一个特殊文件,程序退出时应 unlink() 删除,否则残留文件可能导致下次启动失败。

服务端实现示例(流式)

以下是一个简单的服务端代码框架:

- 创建 socket:int sock = socket(AF_UNIX, SOCK_STREAM, 0);
- 设置地址结构:sun.sun_family = AF_UNIX; strcpy(sun.sun_path, "/tmp/mysocket");
- bind(sock, (struct sockaddr*)&sun, sizeof(sun));
- listen(sock, 5); 接受连接:client_fd = accept(sock, NULL, NULL);
- 使用 read(client_fd, buf, sizeof(buf)) 接收数据。
- 处理完后 close(client_fd),最后 close(sock) 并 unlink("/tmp/mysocket");

确保路径目录可写,且权限合理。多个进程不能同时绑定同一路径。

客户端实现要点

客户端只需连接已存在的 socket 路径:

- 同样调用 socket(AF_UNIX, SOCK_STREAM, 0) 创建套接字。
- 设置相同 sun_path 路径,调用 connect(sock, (struct sockaddr*)&sun, sizeof(sun))。
- 连接成功后可用 write() 发送数据,read() 接收响应。
- 完成后 close() 套接字,无需 unlink()。

若 connect 失败,检查服务端是否运行、socket 文件是否存在、路径是否一致、权限是否允许访问。

传输文件描述符(高级用法)

Unix Domain Socket 支持通过辅助数据(ancillary data)传递文件描述符,使用 sendmsg() 和 recvmsg() 配合 SCM_RIGHTS 类型控制消息。

- 构造 msghdr 结构,设置控制缓冲区 cmsg,将 fd 填入其中。
- 调用 sendmsg() 发送;接收方用 recvmsg() 提取 cmsg_data 中的 fd。
- 传递后,双方均可操作同一文件资源,适用于进程间共享 socket 或打开的文件。

此特性是 UDS 的独特优势,常用于守护进程与子进程协作场景。

基本上就这些。掌握基础流程后,结合错误处理和路径管理,就能稳定使用 Unix Domain Socket 实现高效本地通信。不复杂但容易忽略细节,比如清理 socket 文件和权限问题。


# linux  # cms  # 字节  # ai  # unix  # stream  # NULL  # int  # Struct  # 服务端  # 绑定  # 适用于  # 客户端  # 是一种  # 流式  # 完成后  # 是一个  # 传输文件  # 就能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python文本处理实践_日志清洗解析【指导】  音响网站制作视频教程,隆霸音响官方网站?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何快速搭建高效香港服务器网站?  EditPlus 正则表达式 实战(3)  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何快速上传自定义模板至建站之星?  如何在服务器上三步完成建站并提升流量?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  ,交易猫的商品怎么发布到网站上去?  javascript中闭包概念与用法深入理解  JavaScript如何实现继承_有哪些常用方法  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  使用豆包 AI 辅助进行简单网页 HTML 结构设计  如何解决hover在ie6中的兼容性问题  Android okhttputils现在进度显示实例代码  Linux后台任务运行方法_nohup与&使用技巧【技巧】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  网页设计与网站制作内容,怎样注册网站?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel Docker环境搭建教程_Laravel Sail使用指南  如何彻底卸载建站之星软件?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  javascript中对象的定义、使用以及对象和原型链操作小结  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何注册花生壳免费域名并搭建个人网站?  Java遍历集合的三种方式  linux写shell需要注意的问题(必看)  手机软键盘弹出时影响布局的解决方法  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何破解联通资金短缺导致的基站建设难题?  如何快速搭建虚拟主机网站?新手必看指南  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  重庆市网站制作公司,重庆招聘网站哪个好?  简单实现jsp分页