导读:本期聚焦于小伙伴创作的《Linux中rpc是什么意思?一文搞懂远程过程调用原理与用法》,敬请观看详情。把本地函数调用延伸到网络另一端,就是RPC要解决的核心问题。在Linux环境下,RPC允许程序像调用本机函数一样去执行远端服务器上的过程,底层依靠XDR做数据序列化、通过端口映射服务定位程序。传统Sun RPC配合rpcbind实现跨主机通信,开发者用rpcgen工具就能根据接口描述自动生成客户端与服务端骨架代码。理解RPC有助于排查NFS、NIS等依赖该机制的系统服务异常,也能在分布式项目中合理选型通信框架。

在Linux系统中,RPC是Remote Procedure Call的缩写,中文叫作远程过程调用。它的本质是想让开发者在编写网络程序时,不用自己处理socket连接、数据打包、网络传输这些繁琐细节,而是像调用本地函数那样去调用另一台机器上运行的函数。内核与用户态工具共同提供了这套机制,使得跨主机的方法执行对代码编写者来说是透明的。

Linux中rpc是什么意思?一文搞懂远程过程调用原理与用法

RPC的基本工作原理

RPC的核心思路是“桩”和“骨架”的分工。客户端有一段叫stub(桩)的代码,它看起来像个普通函数,实际上会把参数收集起来,转换成可以在网络上传输的格式,再发给服务端。服务端也有一段叫skeleton(骨架)的代码,负责接收请求、还原参数、真正调用本地实现的函数,并把结果原路返回。整个过程对上层业务逻辑隐藏了网络细节。

在Linux传统的Sun RPC实现里,数据格式统一使用XDR(External Data Representation)做序列化,保证不同字节序、不同架构的机器之间能正确读懂对方的数据。服务位置则依赖rpcbind(早期叫portmap)这个守护进程,服务端把自己监听的端口和程序号注册上去,客户端先查rpcbind拿到端口,再发起真正调用。

用rpcgen快速体验Linux RPC

Linux自带rpcgen工具,可以根据一个接口定义文件(.x文件)自动生成客户端桩、服务端骨架以及XDR编码代码。下面给出一个最简单的示例,定义一个加法服务,让远端帮我们算两个数之和。

/* calc.x 定义RPC接口 */
program CALC_PROG {
    version CALC_VER {
        int ADD(int, int) = 1;
    } = 1;
} = 0x20000001;

/* 执行 rpcgen calc.x 会生成 calc_clnt.c calc_svc.c calc_xdr.c 等文件 */

服务端只需要实现ADD函数逻辑,例如把两个参数相加返回。下面是一段简化版的服务端实现代码,展示了如何注册服务并进入等待。

#include <rpc/rpc.h>
#include "calc.h"

int *add_1_svc(int *a, int *b, struct svc_req *req) {
    static int result;
    result = *a + *b;
    return &result;
}

int main() {
    register int prog = 0x20000001;
    register int vers = 1;
    if (svc_create(calc_prog_1, prog, vers, "tcp") == 0) {
        /* 创建TCP服务失败处理 */
        return 1;
    }
    svc_run();
    return 0;
}

客户端则可以像调用本地函数一样写代码,rpcgen生成的桩函数名通常是add_1,内部自动完成连接与序列化。

#include <rpc/rpc.h>
#include "calc.h"

int main() {
    CLIENT *cl = clnt_create("192.168.0.1", 0x20000001, 1, "tcp");
    int a = 3, b = 4;
    int *res = add_1(&a, &b, cl);
    if (res) {
        /* 输出结果应为7 */
    }
    clnt_destroy(cl);
    return 0;
}

RPC在Linux系统中的典型应用

很多基础服务都构建在RPC之上。最常见的就是NFS(网络文件系统),客户端挂载远端目录时,文件的读写请求就是通过RPC发给服务端的nfsd进程。还有NIS(网络信息服务),用于统一管理局域网内的用户账号与主机名,同样依赖RPC做查询通信。

使用RPC的好处是开发分布式功能时网络细节被极大简化,但缺点也很明显:传统RPC协议较重,调试不如HTTP接口直观,且在云原生环境里常被更轻量的gRPC、Thrift取代。不过理解它仍有助于维护老系统,也能帮助弄清为什么某些Linux服务必须开启rpcbind才能正常工作。

常见误区与排查思路

不少初学者会把<input>这类HTML标签和RPC混为一谈,其实二者毫无关系,前者是网页表单元素,后者是系统级通信机制。另外有人以为RPC一定基于TCP,实际上Sun RPC同时支持UDP与TCP,UDP常用于简单查询,TCP用于大数据量或可靠传输。

当Linux上NFS挂载失败时,第一步往往不是查网络,而是用rpcinfo命令看对端rpcbind是否在线、程序是否注册。例如执行rpcinfo -p 192.168.0.1能列出对方暴露的所有RPC服务与端口,若列表为空,基本可断定rpcbind未启动或防火墙拦截。

对比项传统Sun RPC现代gRPC
序列化XDRProtocol Buffers
传输TCP/UDPHTTP/2
代码生成rpcgenprotoc插件
跨语言较弱

通过上述对比可以看出,RPC并非某一种固定技术,而是一类设计思想。在Linux里提到RPC,多数情况是指系统自带的Sun RPC体系,它虽显老旧,却是理解许多网络服务运作方式的钥匙。

rpcLinuxremote_procedure_call修改时间:2026-08-08 18:57:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。