Unix Domain Socket和eventfd
在Linux开发中,Unix Domain Socket和eventfd是两种不同的通信机制,它们的设计目标和适用场景有显著差异。以下分点解释并配合示例说明:
一、Unix Domain Socket(UDS)
1. 是什么?
- 一种**本地进程间通信(IPC)**机制,基于文件系统路径而非网络端口
- 协议族为
AF_UNIX(而非网络Socket的AF_INET/AF_INET6)
2. 核心特点
- 高性能:数据直接在内核缓冲区传递,无需经过网络协议栈
- 支持多种通信模式:流式(
SOCK_STREAM,类似TCP)、数据报(SOCK_DGRAM,类似UDP)和可靠数据报(SOCK_SEQPACKET) - 权限控制:通过文件系统权限(
chmod)控制访问 - 传递文件描述符:可通过
sendmsg发送文件描述符(其他IPC机制难以实现)
3. 典型场景
- Docker守护进程:
/var/run/docker.sock - 数据库本地连接:MySQL客户端通过
/var/run/mysqld/mysqld.sock连接本地服务 - X Window系统:GUI应用与X服务器的通信
- Systemd服务:通过
/run/systemd/下的socket文件通信
4. 代码片段
// 服务端
struct sockaddr_un addr = {.sun_family = AF_UNIX};
strcpy(addr.sun_path, "/tmp/mysocket");
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
二、eventfd
1. 是什么?
- 一个轻量级事件通知机制,本质是一个内核维护的64位计数器
- 通过
eventfd()系统调用创建,返回一个文件描述符
2. 核心特点
- 极低开销:适合高频事件通知(如线程间唤醒)
- 与epoll集成:可直接加入事件循环监听
- 原子操作:读/写操作是原子的,线程安全
- 跨进程可用:通过fork或传递fd给其他进程
3. 典型场景
- 线程池唤醒:主线程通过写eventfd通知工作线程有新任务
- 协程调度:如Golang的runtime用类似机制唤醒阻塞的goroutine
- 信号处理:将信号转换为eventfd事件,避免在信号处理函数中执行复杂逻辑
- IO多路复用集成:与epoll结合实现高效事件驱动架构
4. 代码片段
int efd = eventfd(0, EFD_NONBLOCK); // 创建eventfd
write(efd, &(uint64_t){1}, sizeof(uint64_t)); // 发送事件
read(efd, &counter, sizeof(uint64_t)); // 接收事件
三、Unix Socket vs TCP/UDP Socket
| 特性 | Unix Domain Socket | TCP/UDP Socket |
|---|---|---|
| 通信范围 | 同一主机 | 跨网络 |
| 地址形式 | 文件路径(如/tmp/foo.sock) | IP地址+端口(如127.0.0.1:8080) |
| 协议开销 | 无网络协议栈处理 | 需要处理TCP握手/重传等 |
| 性能 | 比TCP快2倍以上(实测) | 受网络延迟和带宽限制 |
| 权限控制 | 文件系统权限 | 依赖网络防火墙 |
| 数据边界保留 | 流式/数据报均保留 | TCP是流式无边界,UDP有边界 |
示例对比
-
Redis客户端连接
- 远程连接:
redis-cli -h 192.168.1.100 -p 6379(TCP) - 本地连接:
redis-cli -s /tmp/redis.sock(UDS)
- 远程连接:
-
Nginx本地配置
server {listen 80; # TCP Socketlisten unix:/var/run/nginx.sock; # Unix Socket }
四、组合使用案例
场景:构建一个高性能本地服务
- 使用Unix Socket处理客户端请求(高吞吐)
- 使用eventfd在服务内部线程间传递事件(低延迟)
- 用epoll同时监听UDS和eventfd,实现统一事件循环
// 伪代码示例
int uds_fd = create_unix_socket("/tmp/service.sock");
int efd = eventfd(0, EFD_NONBLOCK);struct epoll_event events[2];
epoll_ctl(epfd, EPOLL_CTL_ADD, uds_fd, &(struct epoll_event){.events=EPOLLIN});
epoll_ctl(epfd, EPOLL_CTL_ADD, efd, &(struct epoll_event){.events=EPOLLIN});while(1) {int n = epoll_wait(epfd, events, 2, -1);for (每个就绪事件) {if (事件来自uds_fd) 处理客户端请求();if (事件来自efd) 处理内部事件();}
}
总结选择依据:
- 需要跨主机通信 → TCP/UDP Socket
- 本地高性能IPC → Unix Domain Socket
- 轻量级事件通知 → eventfd
- 混合场景 → UDS + eventfd + epoll组合
在 Linux 开发中,Socket Pair 是一种特殊的进程间通信(IPC)机制,与 Unix Domain Socket (UDS)、TCP/UDP Socket 和 eventfd 有显著区别。以下是它们的核心差异、使用场景和实际示例:
1. Socket Pair 是什么?
- 定义:通过
socketpair()系统调用创建的一对已连接的匿名 Unix Domain Socket。 - 特点:
- 无需绑定文件路径:直接创建一对已连接的 socket,没有文件系统路径。
- 双向通信:两个 socket 可以互相读写(类似全双工管道)。
- 匿名性:仅限同一进程或父子进程间使用(无法被无关进程访问)。
- 支持多种模式:流式(
SOCK_STREAM)或数据报(SOCK_DGRAM)。
示例代码
#include <sys/socket.h>
#include <stdio.h>int main() {int sock_pair[2];socketpair(AF_UNIX, SOCK_STREAM, 0, sock_pair); // 创建 socket pairchar buf[128];write(sock_pair[0], "Hello from sock0", 16); // 写入 sock0read(sock_pair[1], buf, sizeof(buf)); // 从 sock1 读取printf("Received: %s\n", buf); // 输出 "Hello from sock0"close(sock_pair[0]);close(sock_pair[1]);return 0;
}
2. Socket Pair 与其他通信机制的区别
对比 Unix Domain Socket (UDS)
| 特性 | Socket Pair | Unix Domain Socket |
|---|---|---|
| 地址绑定 | 匿名,无需文件路径 | 需绑定文件路径(如 /tmp/foo.sock) |
| 可见性 | 仅限创建进程及其子进程 | 所有有权限访问文件的进程 |
| 使用场景 | 父子进程或线程间通信 | 任意进程间通信(需共享路径) |
| 性能 | 更高(无需文件系统操作) | 高(但需文件路径管理) |
对比 TCP/UDP Socket
| 特性 | Socket Pair | TCP/UDP Socket |
|---|---|---|
| 通信范围 | 同一主机,同一进程或父子进程 | 跨网络或本机(需网络协议栈) |
| 地址形式 | 无地址(匿名) | IP地址 + 端口 |
| 协议开销 | 无网络协议栈开销 | 需处理 TCP 握手、UDP 不可靠性等 |
对比 eventfd
| 特性 | Socket Pair | eventfd |
|---|---|---|
| 通信方向 | 双向(支持数据收发) | 单向(仅事件通知,无数据内容) |
| 数据类型 | 任意字节流或数据报 | 64位计数器(仅数值增减) |
| 典型用途 | 进程/线程间数据交换 | 事件通知(如唤醒线程池) |
3. Socket Pair 的典型使用场景
场景 1:父子进程通信
父进程创建 socket pair,fork 子进程后,父子各关闭一个 socket,实现双向通信:
int sock_pair[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, sock_pair);if (fork() == 0) { // 子进程close(sock_pair[0]); // 关闭父进程端write(sock_pair[1], "Child message", 13);
} else { // 父进程close(sock_pair[1]); // 关闭子进程端read(sock_pair[0], buf, sizeof(buf));
}
场景 2:线程间通信
多个线程共享同一 socket pair,实现高效数据传递(需注意线程同步)。
场景 3:替代管道(Pipe)
Socket pair 比传统管道更灵活:
- 管道是单向的,socket pair 是双向的。
- Socket pair 支持数据报模式(
SOCK_DGRAM)。
4. 组合使用案例
需求:构建一个多进程服务,主进程通过 socket pair 与子进程通信,同时使用 eventfd 通知事件。
// 主进程
int sock_pair[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, sock_pair);int efd = eventfd(0, EFD_NONBLOCK);if (fork() == 0) { // 子进程close(sock_pair[0]);// 监听 sock_pair[1] 和 efdwhile (1) {// 通过 sock_pair[1] 与主进程交换数据// 通过 eventfd 接收事件通知}
} else { // 主进程close(sock_pair[1]);write(sock_pair[0], "Task data", 9); // 发送数据write(efd, &(uint64_t){1}, 8); // 发送事件
}
5. 总结:如何选择?
- 需要跨网络通信 → TCP/UDP Socket。
- 本地任意进程间通信 → Unix Domain Socket(需文件路径)。
- 父子进程或线程间高效双向通信 → Socket Pair(匿名,无需文件路径)。
- 轻量级事件通知 → eventfd(无数据内容,仅计数器)。
- 混合场景 → 组合使用(如 Socket Pair + eventfd + epoll)。
相关文章:
Unix Domain Socket和eventfd
在Linux开发中,Unix Domain Socket和eventfd是两种不同的通信机制,它们的设计目标和适用场景有显著差异。以下分点解释并配合示例说明: 一、Unix Domain Socket(UDS) 1. 是什么? 一种**本地进程间通信&am…...
【万字长文】基于大模型的数据合成(增强)及标注
写在前面 由于合成数据目前是一个热门的研究方向,越来越多的研究者开始通过大模型合成数据来丰富训练集,为了能够从一个系统的角度去理解这个方向和目前的研究方法便写了这篇播客,希望能对这个领域感兴趣的同学有帮助! 欢迎点赞&…...
2025年能源工作指导意见
2025年是“十四五”规划收官之年,做好全年能源工作意义重大。为深入贯彻落实党中央、国务院决策部署,以能源高质量发展和高水平安全助力我国经济持续回升向好,满足人民群众日益增长的美好生活用能需求,制定本意见。 一、总体要求…...
【Elasticsearch】Elasticsearch 中使用 HDFS 存储快照
在 Elasticsearch 中使用 HDFS 存储快照的步骤如下: 1.安装 HDFS 插件 要使用 HDFS 存储 Elasticsearch 的索引快照,需要在 Elasticsearch 集群的所有节点上安装 HDFS 插件。 • 在线安装:适用于网络环境良好的场景,执行以下命…...
Oracle 数据库基础入门(四):分组与联表查询的深度探索(下)
在 Oracle 数据库的操作中,联合查询与子查询是获取复杂数据的关键手段。当单表数据无法满足业务需求时,联合查询允许我们从多张表中提取关联信息,而子查询则能以嵌套的方式实现更灵活的数据筛选。对于 Java 全栈开发者而言,掌握这…...
深搜专题6:迷宫问题
描述 设有一个N*N方格的迷宫,入口和出口分别在左上角和右上角。 迷宫格子中分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下: 即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过…...
【每日学点HarmonyOS Next知识】web滚动、事件回调、selectable属性、监听H5内部router、Grid嵌套时高度设置
【每日学点HarmonyOS Next知识】web滚动、事件回调、selectable属性、监听H5内部router、Grid嵌套时高度设置 1、HarmonyOS WebView加载url无法滚动? scroll 里面嵌套webView,demo参考: // xxx.ets import web_webview from ohos.web.webv…...
MacBook上API调⽤⼯具推荐
在当今的软件开发中,API调用工具已经成为了开发者不可或缺的助手。无论是前端、后端还是全栈开发,API的调试、测试和管理都是日常工作中的重要环节。想象一下,如果没有这些工具,开发者可能需要手动编写复杂的CURL命令,…...
如何构建一个 Docker 镜像?
1. 创建 Dockerfile 文件 (1)选择工作目录 首先,创建一个项目目录,并进入该目录: mkdir my-docker-project cd my-docker-project(2)创建 Dockerfile 使用任何文本编辑器(如 nano、…...
【数据结构】LRUCache|并查集
目录 一、LRUCache 1.概念 2.实现:哈希表双向链表 3.JDK中类似LRUCahe的数据结构LinkedHashMap 🔥4.OJ练习 二、并查集 1. 并查集原理 2.并查集代码实现 3.并查集OJ 一、LRUCache 1.概念 最近最少使用的,一直Cache替换算法 LRU是Least Recent…...
go数组的声明和初始化
1.数组简介 数组是可以存放多个同一类型的数据。数组也是一种数据类型,在go中,数组是值类型。数组的长度也是数组类型的一部分,所以[2]int和[3]int属于不同的数据类型。 2.数组的长度也是类型的一部分 var arr1 [2]intvar arr2 [3]intfmt.P…...
基于STM32的智能家居中控系统
基于STM32的智能家居中控系统 下载源文件 链接:博客 第1章 绪论 1.1 研究背景与意义(扩增至1500字) • 市场数据支撑:引用IDC报告数据显示,中国智能家居设备市场年增长率达25%(2022年市场规模超6500亿元) …...
初识Qt · 信号与槽 · 基础知识
目录 前言: 信号和槽初识 两个问题 前言: 本文我们正式开始介绍信号与槽这个概念,在谈及Qt中的信号与槽这个概念之前,我们不妨回顾一下Linux中的信号,比如发生了除0错误,OS就会给该进程发送一个信号&am…...
Java高频面试之集合-03
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…...
常用的分布式ID设计方案
常用的分布式ID设计方案 在分布式系统中,生成全局唯一的ID是一个常见的需求。无论是数据库表中的主键,还是消息队列的消息ID,都需要一个高效且可靠的唯一标识符。本文将探讨几种常用的分布式ID设计方案,并分析它们的优缺点。 1. …...
宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪
2025年3月5日,机器人行业龙头宇树科技(Unitree)在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司,聚焦智能机器人研发与销售,标志着宇树科技在华南市场的战…...
【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)
背景: 已经用这个脚本的记得设置Wifi时候,关闭“自动登录” 前几天实在忍受不了CHD-WIFI动不动就断开,一天要重新连接,点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本,那样我就可以解放双手&…...
基于遗传算法的无人机三维路径规划仿真步骤详解
基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...
【Elasticsearch】索引生命周期管理相关的操作(Index Lifecycle Actions)
Elasticsearch 的Index Lifecycle Management(ILM)是一种用于管理索引生命周期的工具,它允许用户根据索引的使用阶段(如热、温、冷、冻结)自动执行一系列操作。以下是详细解释 Elasticsearch 中的索引生命周期操作(Index Lifecycl…...
计算机毕业设计SpringBoot+Vue.js电商平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理
华为w515麒麟芯片版,还有非麒麟芯片版本,是一款信创电脑,一般安装的UOS系统。 准备一个空U盘,先下载镜像文件及启动盘制作工具,连接如下: 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…...
初始提示词(Prompting)
理解LLM架构 在自然语言处理领域,LLM(Large Memory Language Model,大型记忆语言模型)架构代表了最前沿的技术。它结合了存储和检索外部知识的能力以及大规模语言模型的强大实力。 LLM架构由外部记忆模块、注意力机制和语…...
Vue+el-upload配置minIO实现大文件的切片并发上传、上传进度展示、失败重试功能
vue3el-upload实现切片上传 效果图 初始界面 上传中的界面 上传完成的界面 上传失败的界面 <template><div><el-uploadclass"BigFileUpload"ref"uploadRef"action"#"drag:show-file-list"false":on-change"…...
正则表达式梳理(基于python)
正则表达式(regular expression)是一种针对字符串匹配查找所定义的规则模式,独立于语言,但不同语言在实现上也会存在一些细微差别,下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…...
Scala 中 val 和对象内部状态的关系
在 Scala 中,val 用于声明不可变的变量,这意味着一旦 val 被赋值,它的引用(即指向的内存地址)就不能再改变。然而,这并不影响对象内部的状态(即对象的属性)是否可以改变。具体来说&a…...
skynet简单游戏服务器的迭代
在上一篇的基础上做了改进,主要三个更新: 基础框架引入多一层redis缓存,用于持久化数据,加速数据访问。原本需要通过mysql读取的操作,直接改成与redis层交互,redis会自动写入mysql,保证AP 最终…...
Python学习第八天
查看函数参数 操作之前给大家讲一个小技巧:如何查看函数的参数(因为python的底层源码是C语言并且不是开放的,也一直困扰着刚学习的我,这个参数叫什么名之类的看doc又总是需要翻译挺麻烦的)。 比如我们下面要说到的op…...
美股回测:历史高频分钟数据的分享下载与策略解析20250305
美股回测:历史高频分钟数据的分享下载与策略解析20250305 在金融分析和投资决策的精细化过程中,美股历史分钟高频数据发挥着至关重要的作用。这些数据以其详尽性和精确性,记录了股票每分钟的价格波动和成交量变化,为投资者提供了…...
【仿muduo库one thread one loop式并发服务器实现】
文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…...
服务流程设计和服务或端口重定向及其websocket等应用示例
服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...
