IPC Socket实战:用Unix Domain Socket搞定本地进程间通信
1. 先把概念摆正IPC 和 Socket 到底是什么关系在聊进程间通信之前先说个具体场景你的 Web 服务端收到了一个请求需要交给另一个进程去处理计算这两个进程之间怎么把数据传过去再比如监控程序要把采集到的数据实时推给可视化面板中间隔了不止一个进程数据链路怎么搭这些问题的答案都指向同一件事——IPC也就是进程间通信。很多新手容易把 IPC 想得很玄其实它就是操作系统提供的一套“让进程之间互相传数据”的机制。管道、消息队列、共享内存、信号量、信号这些都是 IPC 的经典手段。而 Socket 这个词大家更熟悉的是网络编程里的 TCP/UDP Socket。但这里要澄清一个非常关键的概念Socket 不止可以用于跨机器的网络通信它还有一种专门为“同一台机器上的进程通信”设计的形态——Unix Domain Socket简称 UDS也叫本地 Socket、IPC Socket。我最早接触 IPC Socket 是在一个内部系统的改造里。当时有两个服务需要高频交换结构化数据试过管道吞吐上不去试过共享内存又觉得同步逻辑太复杂容易出隐蔽的并发问题。最后换成本地 Socket问题一下子清爽了。原因很简单Socket 本身是一个成熟且完整的通信模型有人帮你把缓冲、流控、错误处理都做了你只需要关注业务数据本身。所以理解 IPC-Socket本质上就是在理解一件事如何用 Socket 这套成熟模型搞定同一台机器上的高效进程通信。这篇文章不打算堆概念而是从为什么选它、底层怎么运转、代码怎么写、坑怎么踩这几个维度把这个主题拆开揉碎。无论你是刚接触系统编程的学生还是在工作中被 IPC 选型困扰的开发者这套思路都能直接用上。注意一个技术细节本文所说的 IPC Socket默认指 Unix Domain Socket。Windows 上也有类似机制命名管道但形态和接口差异较大不在本文讨论范围内。Linux 和 macOS 的用法基本一致下面所有代码都是基于 Linux 环境验证的。2. 为什么选 Socket 做 IPC先看看其他方案差在哪2.1 管道、共享内存和消息队列的各自短板选型之前得把同行们都拉出来遛一圈。管道Pipe是最简单的方式一条命令的输出接到另一条命令的输入Shell 里天天在用。但它有个天生缺陷管道是单向的如果要双向通信得建两条管道而且它传的是字节流没有明确的消息边界A 进程写进去的数据B 进程读出来时要自己处理“半包”和“粘包”问题。如果只是简单地把日志从这个程序挪到那个程序管道没问题但要承载复杂的请求响应模型代码会很快失控。共享内存是公认吞吐最高的方案数据不需要在内核里复制来复制去直接映射同一块物理内存就能读写。但它的代价是你必须自己处理并发同步。两个进程同时写同一块内存怎么办要用信号量或互斥锁一个进程写了一半另一个进程来读怎么办要设计协议或状态标志。我见过不少团队栽在这里性能是上去了但排查问题的难度也直线上升尤其是多进程同时崩溃、共享内存没释放的场景光定位就够喝一壶。消息队列如 System V 消息队列、POSIX 消息队列解决了消息边界的问题每条消息自带类型和长度接收方可以按类型选择性读取省心不少。但它也有自己的麻烦队列容量是有限的消息堆积要处理背压有些消息队列在内核里系统重启数据就没了加上消息队列的模型和业务里的“连接”“会话”概念对不上写复杂交互协议时总觉得别扭。2.2 Socket 方案的独特优势说完别人的短板再回头看 Socket。首先Socket 接口就是业界标准UNIX/Linux 程序员几乎没有不认识 socket/bind/listen/accept 这一套函数的学习成本几乎为零。把 domain 参数从 AF_INET 换成 AF_UNIX很多东西就可以直接复用——这套模型支持双向通信、支持全双工、自带流控制和拥塞处理机制而且它是基于连接的流式 Socket天然契合“服务端-客户端”的架构。你完全可以把分布式系统里跑得很熟的 Socket 编程经验平移成本地通信心智负担小很多。性能上本地 Socket 因为不走网络协议栈没有 IP 包头和 TCP 握手那些开销在内核里走过的路径远比 TCP 短。同一台机器上的两个进程用 UDS 通信实测吞吐可以轻松跑到每秒几万甚至几十万条小消息延迟通常只有几微秒到十几微秒。虽然绝对速度不如纯共享内存但对于绝大多数业务场景来说这个性能已经绰绰有余而它带来的代码可维护性、可靠性是共享内存给不了的。还有一点经常被忽略Socket 天然支持把文件描述符fd从一个进程传给另一个进程。这个能力太有用了——一个进程打开了某个文件可以把它的 fd 直接通过 Socket 传给另一个进程让后者也能操作这个文件。管道和消息队列都做不到这种操作。后面我会单独讲这个“传送文件描述符”的黑科技。2.3 和 TCP Socket 的核心差异别被名字误导很多人第一次看到 IPC Socket 时下意识会问这不就是 TCP 吗把 IP 地址换成本地路径而已。这个想法部分对部分错。接口确实长得像但要搞清楚三个关键差异。第一TCP Socket 走的是完整的网络协议栈三次握手、拥塞控制、滑动窗口、重传机制全部在内核里跑一遍。而本地 Socket 不走这些它就是在内核里直接拷贝数据从一个进程的地址空间拷到另一个进程的地址空间。TCP 的那些复杂机制在这里毫无用武之地纯粹是浪费。第二本地 Socket 的地址是一个文件系统路径比如 /tmp/my.sock不是 IP 加端口。所以它自然就继承了文件系统的权限管理谁的权限能读这个文件、谁能往里写由文件权限位决定。这意味着你不需要在应用层做复杂的鉴权——文件权限就已经帮你挡住了一批不速之客。第三连接建立的方式不同。TCP 需要双方经过网络握手中间还可能发生超时、重连。本地 Socket 连接建立就是内核里一次轻量级的操作几乎没有失败延迟。当然它也有一个特有的麻烦——如果创建 Socket 文件的进程退出了文件不会自动删除残留的文件会让下次 bind 直接报错。这个坑几乎每个做 UDS 的人都踩过后面排查部分我会专门讲。3. 底层原理数据从一个进程到另一个进程中间发生了什么3.1 一次完整写入背后的内核动作为了真正理解后面代码里每一步在干嘛有必要看一眼底层数据流。假设进程 A 调用 send() 往 Socket 里写入一段数据内核大致做了这几件事校验 Socket 合法性把用户空间的缓冲区数据拷贝到内核空间的 Socket 发送缓冲区唤醒等待在该 Socket 上的接收进程进程 B告知它“有数据来了”进程 B 被调度后调用 recv()内核把数据从 Socket 接收缓冲区拷贝到进程 B 的用户空间缓冲区。注意对于本地 Socket这里少了一大块 TCP 的活儿没有封装 TCP 头、IP 头、没有路由查找、没有网卡驱动参与。数据从头到尾都在内核空间内部搬运比起走一遍完整协议栈至少要省掉两次用户态与内核态的深度切换以及一串网卡相关的处理逻辑。这也是为什么 UDS 比 TCP loopback 快的根本原因——即使你连接 127.0.0.1数据也会经历协议栈的全套流程。3.2 流式 Socket 和数据报 Socket 怎么选Socket 家族里有两个风格差异很大的“兄弟”SOCK_STREAM流式和 SOCK_DGRAM数据报。本地 Socket 同样有这两种选错后面会很痛苦。SOCK_STREAM 基于字节流像一条自来水管只管把水送过去不关心你在哪个位置“切一刀”。它的优点是可靠数据不会丢失、不会乱序送多少就收到多少。但缺点是没有消息边界你怎么把一串拼接的字符重新拆成一条条原始消息是应用层自己的事。这就是常见的“粘包”“半包”问题的根源。SOCK_DGRAM 基于数据报像寄快递每个包裹自带边界寄的时候是一个包收的时候就整体是一个包。对于短小的消息比如一条命令、一个状态这种模型简直完美代码里不需要自己做拆包拼包。但它有两个限制单条消息有长度上限通常取决于系统配置而且如果接收缓冲区满数据报可能被直接丢弃它是不可靠的。我自己的选型原则很简单消息长度固定、单条不超过几 KB、而且每条都是完整独立语义用 SOCK_DGRAM消息长度不确定、需要长连接保活、类似请求响应模式的用 SOCK_STREAM。大多数业务场景其实更适合 SOCK_STREAM因为它足够通用加上一点应用层协议设计就能支撑很复杂的交互。3.3 地址结构和 bind 的怪异之处本地 Socket 的地址定义是一个 sockaddr_un 结构体字段很简单就一个族标识加一个路径。但是这里有个特别容易踩的坑路径的长度上限非常有限。Linux 上 sockaddr_un 里的 sun_path 一般是 108 字节不同系统略有差异macOS 是 104 字节。如果你的 Socket 文件路径过长bind 会直接失败报错还不好查。所以约定俗成的做法是把 Socket 文件放在短路径下比如 /tmp 或者 /var/run 下别埋在多层目录里。bind 的“怪异”在于它和文件系统的耦合。调用 bind 时内核会在指定路径上创建一个 Socket 文件。这个文件是一个特殊类型的文件你用 ls -l 能看到它的类型字符是 s。它一旦创建就会一直存在直到有人手动删除或进程关闭后自行清理。所以要养成习惯在服务启动时检查目标路径是否已存在如果存在就先删掉再执行 bind。否则上次程序崩了留下的残留文件会导致这一次 bind 报“Address already in use”。这个坑的复现率极高几乎是 UDS 新手必经的一道坎。4. 实操从零手写一套本地 Socket 通信代码4.1 服务端socket、bind、listen、accept 的完整闭环理论讲完动手写代码。下面这套是典型的最简服务端逻辑很清晰创建 Socket - 绑定路径 - 开始监听 - 循环接受连接 - 处理数据。我用的是大家最熟悉的 C 语言 API这样能看到最底层的细节。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include sys/un.h #define SOCK_PATH /tmp/ipc_example.sock int main() { int server_fd, client_fd; struct sockaddr_un addr; char buf[1024]; // 1. 创建本地 SocketAF_UNIX 表示本地通信SOCK_STREAM 表示流式 server_fd socket(AF_UNIX, SOCK_STREAM, 0); if (server_fd 0) { perror(socket); exit(EXIT_FAILURE); } // 2. 处理残留文件路径已存在则先删除避免 bind 失败 unlink(SOCK_PATH); // 3. 填充地址结构 memset(addr, 0, sizeof(addr)); addr.sun_family AF_UNIX; strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1); // 4. 绑定路径 if (bind(server_fd, (struct sockaddr *)addr, sizeof(addr)) 0) { perror(bind); exit(EXIT_FAILURE); } // 5. 开始监听 if (listen(server_fd, 5) 0) { perror(listen); exit(EXIT_FAILURE); } printf(Server is listening on %s\n, SOCK_PATH); // 6. 循环接受客户端连接 while (1) { client_fd accept(server_fd, NULL, NULL); if (client_fd 0) { perror(accept); continue; } // 读取客户端数据 ssize_t n read(client_fd, buf, sizeof(buf) - 1); if (n 0) { buf[n] \0; printf(Received: %s\n, buf); } // 回写响应 const char *response hello from server; write(client_fd, response, strlen(response)); close(client_fd); } close(server_fd); return 0; }有几个细节值得单独说明。unlink 不是可选项是必需品。我不知道多少次因为漏掉这一行重启服务时报 bind error。如果你的服务常年不重启可能一直没事一重启就出事基本就是它。另外 bind 的 sizeof 是很关键的一个参数有些人习惯写 sizeof(struct sockaddr_un)这是对的但如果你图省事写 sizeof(addr.sun_family) strlen(path) 1在 Linux 上也能工作不过一旦涉及抽象命名空间就可能出问题所以老老实实传整个结构体大小最稳妥。4.2 客户端三步走完的极简模型客户端的代码比服务端短得多本质上就是三步创建 Socket、连接、收发数据。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include sys/un.h #define SOCK_PATH /tmp/ipc_example.sock int main() { int sock_fd; struct sockaddr_un addr; char buf[1024]; // 1. 创建 Socket sock_fd socket(AF_UNIX, SOCK_STREAM, 0); if (sock_fd 0) { perror(socket); exit(EXIT_FAILURE); } // 2. 填充地址并连接 memset(addr, 0, sizeof(addr)); addr.sun_family AF_UNIX; strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1); if (connect(sock_fd, (struct sockaddr *)addr, sizeof(addr)) 0) { perror(connect); exit(EXIT_FAILURE); } // 3. 发送数据并接收响应 const char *msg hello from client; write(sock_fd, msg, strlen(msg)); ssize_t n read(sock_fd, buf, sizeof(buf) - 1); if (n 0) { buf[n] \0; printf(Server response: %s\n, buf); } close(sock_fd); return 0; }先启动服务端再启动客户端控制台里能看到服务端打印出 “Received: hello from client”客户端打印出 “Server response: hello from server”。至此一个最原始的进程间双向通信闭环就跑通了。你可以把它推广到任何你需要两个进程协作的场景监控程序推送指标、任务分发、两个服务之间的控制通道。这套骨架是万能底子后面加自己的协议、加线程模型、加超时重传都在这套骨架之上开花。4.3 进阶操作通过 sendmsg 传送文件描述符上面这套收发字符串只是 Socket 能力的冰山一角。真正让我觉得 UDS “不可替代”的是它可以跨进程传送文件描述符。举个例子进程 A 打开了一个配置文件读取了权限校验逻辑但真正的数据操作要交给进程 B 完成。传统做法是把文件内容整个读出来通过 IPC 传给 B但如果文件很大数据拷贝的代价就很高。一个更优雅的方案是A 把那个文件的 fd 通过 Socket 直接“递”给 BB 用自己的 read/write 直接操作那个 fd。文件在内核里天然是共享的fd 只是指向它的句柄所以整个过程中数据不用经过 IPC 层复制。实现方式是 sendmsg/recvmsg配合辅助数据ancillary data把 fd 打包发送。核心代码大概长这样// 发送方把 fd_to_send 打包进辅助数据 struct msghdr msg {0}; struct cmsghdr *cmsg; char buffer[CMSG_SPACE(sizeof(int))]; // 设置消息头和辅助数据 msg.msg_control buffer; msg.msg_controllen sizeof(buffer); cmsg CMSG_FIRSTHDR(msg); cmsg-cmsg_level SOL_SOCKET; cmsg-cmsg_type SCM_RIGHTS; cmsg-cmsg_len CMSG_LEN(sizeof(int)); memcpy(CMSG_DATA(cmsg), fd_to_send, sizeof(int)); // 发送时带一个字节的“哨兵”数据 msg.msg_iov iov; msg.msg_iovlen 1; sendmsg(sock_fd, msg, 0);接收方用 recvmsg 解析辅助数据就能拿到那个 fd。这个技巧在处理“避免在进程间复制大数据”的场景里非常好用。日志系统、数据库连接的跨进程传递、代理进程中转 fd都是它的典型应用。当然它也有自己的一套复杂性——fd 的数量有限传递完要管理生命周期多线程并发传递 fd 时要注意消息错乱的问题。但对于需要它的场景它提供的优雅度无可替代。4.4 用 Python 快速验证思路如果只是验证通信逻辑不想每次改动都编译 C 代码我建议直接上 Python。它的 socket 模块原生支持 AF_UNIX写起来几行就能跑通特别适合原型验证和调试。import socket import os SOCK_PATH /tmp/ipc_python.sock # 服务端 server socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) if os.path.exists(SOCK_PATH): os.unlink(SOCK_PATH) server.bind(SOCK_PATH) server.listen(1) print(Server listening) conn, _ server.accept() data conn.recv(1024) print(fReceived: {data.decode()}) conn.sendall(bhello from python server) conn.close() server.close()对应的客户端import socket SOCK_PATH /tmp/ipc_python.sock client socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) client.connect(SOCK_PATH) client.sendall(bhello from python client) data client.recv(1024) print(fServer response: {data.decode()}) client.close()这套 Python 版本没有线程、没有协议设计纯粹就是让你快速理解“IPC Socket 到底是怎样一种通信通道”。等你摸透了流程再上强度改成多线程服务端、加入消息分隔符、增加断线重连逻辑。一步步从“能跑”进化到“能生产使用”。5. 常见问题与排查技巧实录5.1 bind 报 “Address already in use” 的三种解法这个报错我见得太多了几乎每周都有人在技术群里问一次。核心原因通常是上一次程序运行结束后Socket 文件没有删除新的 bind 企图复用一个已存在的路径。解法有三种。最直接的在服务启动代码里加 unlink(path)。这个方案能解决绝大多数情况要放在 bind 之前。但注意一点如果之前有个服务正在运行你把它停掉再重启这个 unlink 会先把正在监听的旧 Socket 文件删掉可能导致正在连接的客户端暂时连不上。对于刚重启的服务这不算大问题客户端一般会自动重连。还有一种情况是文件残留但权限不对。比如程序是以 root 跑的创建的 Socket 文件归 root 所有后来你用普通用户重启服务unlink 可能因为权限不足失败。这种情况需要先手动删文件或者调整目录权限。最后一种解法是使用 Linux 的抽象命名空间把 sun_path 的第一个字符设为 \0这样 Socket 不会在文件系统中留下可见文件。它的好处是没有文件残留问题、不占路径、不受文件系统权限限制坏处是你用 ls 看不到它排查问题时少了一条线索。生产环境除非有特殊理由否则我不推荐抽象命名空间保持“看得见”的状态出问题时好排查。5.2 粘包半包问题的本质和解法如果你是做网络通信的粘包半包这八个字应该不陌生。SOCK_STREAM 是字节流模型内核只保证“字节顺序”和“字节不丢”不保证“每次写入完整对应一次读取”。一次 send 的数据可能被拆成多次 recv 读到多次 send 的数据也可能被一次 recv 全读走。这个问题的本质是消息边界缺失不是 Bug是流式传输的固有属性。解法我会按复杂度排序。最简单的是“定长消息”每条消息固定长度不够补零。接收方只要攒够固定长度就解析一条。对结构化的固定字段数据这招简单粗暴而且有效。第二种是“分隔符法”消息末尾加特殊字节比如 \n 或者自定义终止符。解析时扫描边界即可。缺点是如果消息内容本身包含分隔符需要转义容易引出一堆边界 case。第三种最通用每条消息头部加固定长度的长度字段比如 4 字节小端整数表示后面内容有多长。接收方先读 4 字节算出载荷长度再完整读一个包。需要处理 socket 缓冲区里同时有多个包或者半包的情况代码要多写一点但这是几乎所有正经协议的选择。我个人的体会是不要逃避粘包问题把它当成协议设计的一部分。早期图省事用报文模型SOCK_DGRAM虽然天然没有粘包但长消息、连接管理等限制会在后期成为更大的瓶颈。与其后期重构不如一开始就接受字节流模型设计好帧格式。5.3 连接数、缓冲区与权限三个容易忽略的隐性坑第一连接数。本地 Socket 的 listen 可以指定 backlog也就是等待队列长度。高并发场景下如果 backlog 太小客户端 connect 会卡住甚至失败。根据实际负载调大 backlog 是常见操作但对本地 Socket 来说backlog 的作用没有 TCP 那么显著因为连接建立过程很快一般不会大量积压。第二缓冲区。SOCK_STREAM 的发送缓冲区和接收缓冲区是有大小限制的。如果写入速度超过读取速度send 会被阻塞默认阻塞模式直到对方读取腾出空间。很多人遇到本地 Socket 卡死第一反应是程序死循环其实很可能只是缓冲区满了在等待对端消费。这时候要么确认对端确实在读取要么考虑调整 SO_SNDBUF / SO_RCVBUF。线程模型也要配合如果服务端是单线程先读后写而客户端也是先写后读两边都在等待对方就会形成死锁。这是经典的全双工通信死锁场景解法不外乎开线程或者调成非阻塞 多路复用。第三权限。因为本地 Socket 表现为文件系统中的文件它的权限位直接决定了谁能连接。默认创建的 Socket 文件权限往往比较宽松取决于 umask如果数据敏感建议显式设置权限或者在创建目录/文件后 chmod。在多人共享的开发机上这个点经常被忽略等到出现安全事件再来排查就晚了。5.4 排查工具和建议清单遇到 UDS 相关的问题我常用的排查套路是先确认 Socket 文件在不在、属性和权限对不对。ls -l 一下那个 .sock 文件类型字符 s 是正常的如果不是说明文件类型可能被人为替换了这种异常基本可以认为是有人动了不该动的东西。接着用 ssSocket Statistics看本地 Socket 连接状态。ss -x 可以列出所有 Unix Domain Socket能看到每个连接的本地路径、对端路径、状态、缓冲区占用。如果一条连接一直卡在某个状态直接能从这看出来。如果需要模拟客户端去测试服务端又不想写代码可以用 socat 或者 nc -U。nc -U /tmp/xxx.sock 可以直接连上本地 Socket 发送手动构造的数据非常省事。我在开发调试时几乎每次都会用到它比自己写临时客户端要快得多。最后强烈建议写一个简单脚本循环检查 Socket 文件是否存在、服务进程是否存活、端口是否还在监听。把它挂到监控系统里比等到用户报障再排查要舒服得多。毕竟这类通信问题一旦出在高峰期定位和修复的时间压力都很大。6. 一些真实的经验体会把 IPC Socket 用顺之后再看很多系统设计的问题思路会完全不同。过去你可能只会用 HTTP 或者消息队列处理进程间通信——这并没有错但如果两个进程就在同一台机器上数据量又很大延迟又敏感绕一大圈走网络协议栈再把数据送回来属实没必要。我的习惯是先判断通信双方在哪里。跨机器的绝对考虑网络方案同机器的优先本地 Socket。它不是银弹共享内存的超高吞吐在某些场景仍是不可替代的但那种场景对绝大多数业务而言太少了。绝大多数“两台机器上的服务要通信”的问题落地到单机内部本地 Socket 的性能和开发效率都是最均衡的选择。另外代码层面的“进程间通信”往往只是第一步真正检验功力的是之后的服务治理怎么优雅地摘除一个节点、怎么处理重启期间的连接抖动、怎么保证协议向后兼容。这些话题每一个都能单独写一篇文章但它们的共同基础是你对底层通信模型的透彻理解。IPC Socket 恰好是一个非常合适的支点它既有网络编程的成熟接口又比网络协议更简单、更直接拿来练手、拿来搭内部骨架都再合适不过。

相关新闻

C++ MFC RS485串口通信Demo:从能跑到稳定上产线的完整实现

C++ MFC RS485串口通信Demo:从能跑到稳定上产线的完整实现

简介:这是一份面向Windows平台C开发者的RS485串口通信入门与实战参考代码,基于MFC类库实现,适合工业自动化、物联网设备等场景下需要完成设备间数据传输的开发者学习。资源以Visual Studio 2015为开发环境,围绕串口对象创建、参数…

2026/10/15 18:37:51 阅读更多 →
Android AIDL跨进程服务:多App共享后台状态的完整实践

Android AIDL跨进程服务:多App共享后台状态的完整实践

简介:面向Android中高级开发者的AIDL跨进程通信实战资源,围绕如何通过AIDL定义一个共享服务,让三个独立App同时绑定并调用同一接口,解决多应用数据交换与协同操作问题。资源配套完整示例工程,包含IService.aidl接口定义…

2026/10/15 18:37:51 阅读更多 →
openclaw-cn 接入 Google Antigravity:google-antigravity-auth 插件 OAuth 认证全指南

openclaw-cn 接入 Google Antigravity:google-antigravity-auth 插件 OAuth 认证全指南

人工智能AI Agent即时通讯后端本地部署语音 【免费下载链接】openclaw-cn 中文社区版OpenClaw,同原版保持定期更新,已内置钉钉、企业微信、飞书、QQ、微信以及国内网络环境优化。你的专属个人AI助手。支持所有操作系统和平台。🦞 项目地址&am…

2026/10/15 18:36:49 阅读更多 →

最新新闻

30天从零开始学AI应用开发(Day 26):项目三完工:调试 Agent 的血泪经验

30天从零开始学AI应用开发(Day 26):项目三完工:调试 Agent 的血泪经验

这是系列的第 26 篇。整个系列写给零基础、想入行 AI 的朋友,每天一篇,30 天后你会做出 3 个能写进简历的项目。这篇解决什么问题 昨天项目三跑通了,有几个朋友说规划步骤挺像样,也有人报告了各种奇怪的状况:跑着跑着不…

2026/10/15 19:24:19 阅读更多 →
中国汽车工业软件的卡脖子清单:从PLM到MES的国产替代路线分析

中国汽车工业软件的卡脖子清单:从PLM到MES的国产替代路线分析

文章目录引言:一辆车背后的软件战争一、汽车工业软件的全景图:五大品类与三条工具链二、卡脖子清单逐项拆解2.1 三维CAD:有替代,但成熟度差距明显2.2 CAE仿真:国产空白最多的重灾区2.3 EDA电子设计自动化:差…

2026/10/15 19:24:19 阅读更多 →
全球大厂的“去英伟达”实验

全球大厂的“去英伟达”实验

头图由AI生成文 | 田渝编 | 沈校10月12日晚间,微软董事长兼首席执行官萨提亚纳德拉在社交媒体上公布了微软自研芯片的最新计划。2027年,微软计划大规模部署Azure Maia 300。当日,微软股价当天上涨1.14%至541.15美元,市值重回4万亿…

2026/10/15 19:24:19 阅读更多 →
被停牌的茶百道,更惨的是加盟商?

被停牌的茶百道,更惨的是加盟商?

多米诺骨牌效应才刚开始。文|段泽钰编|郭梦仪1848年,加州淘金热兴起。商人布兰南做了一件事:他先囤积了大量采矿工具,然后跑到街上大喊“金子!金子!”人群蜂拥而至,工具价格翻倍&…

2026/10/15 19:24:19 阅读更多 →
3Dmol.js 分子可视化实战:浏览器端渲染与交互分析

3Dmol.js 分子可视化实战:浏览器端渲染与交互分析

简介:这份前端项目资源以3Dmol.js为核心,面向具备一定JavaScript基础、希望在网页中实现分子结构可视化的开发者与化学教育工作者。它解决的是在浏览器端解析并渲染PDB、MOL、SDF等分子数据、构建可交互三维模型的问题,适合用于化学教学演示、…

2026/10/15 19:24:19 阅读更多 →
北航何静:Codex调用SketchUp实操,常见智能体均适用

北航何静:Codex调用SketchUp实操,常见智能体均适用

北京航空航天大学副教授何静实测 AI 智能体驱动 SketchUp 草图大师自动建模,覆盖 ChatGPT、Claude Code、Workbuddy、OpenClaw 多款智能体,对比 4 种建模实现路径,完成多类型建筑场景建模与迭代修改。实测场景:现代住宅、10 层玻璃…

2026/10/15 19:23:17 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →