【问题标题】:Remote Procedure Call cleanup远程过程调用清理
【发布时间】:2011-10-01 16:38:14
【问题描述】:

我的情况如下: 我在 C 中实现了一个简单的 RPC 系统,客户端可以通过该系统调用它传递命令的远程函数。该命令在远程机器上执行,并将包含输出的字符串返回给客户端。所以,函数签名是:

char* execute(char* command)

在这个函数中,我为结果字符串做一个 malloc 并返回它。 该功能已发布,客户可以调用它。 我的问题是:在每次远程过程调用之后,我可以通过哪种方式在服务器端释放分配的 char*?

编辑:更详细地说明我的问题:这里的问题是在第一次 rpc 调用之后,服务器因“glibc 检测到 free() 无效指针”错误而崩溃。在执行过程中,我有类似的东西:

char* result = (char*) malloc(STRING_SIZE * sizeof(char));
...
return result;

我假设它正在尝试释放返回的结果,但未能成功。

【问题讨论】:

  • 实际上,我的问题与代码无关:如何在服务器端对通过 RPC 调用分配的内存进行清理?
  • 为什么不用这样的函数:char* execute(char* command, char* output) 将输出存储在output 并返回output。因此,您无需调用 malloc。
  • 你是对的,这可能是一个解决方案,但是 RPC 不允许在可调用过程中使用多个参数,除非我将它们打包在一个结构中。我会试试这个。
  • 啊,我不知道。如果您将输出存储在 char* 命令中,我认为这不是一个好习惯,但它可以工作。
  • 您是从头开始编写 RPC 系统的吗?这样做,您必须注册一个客户端可以调用的函数一个清理函数,RPC 运行时在完成请求时调用该函数,在该函数中进行所需的清理。

标签: c memory-management malloc free rpc


【解决方案1】:

这取决于使用哪种 RPC 机制。如果函数被适当地标记,一些函数可以自动调用返回的指针上的释放函数。

如果您的 RPC 库无法做到这一点,则必须将 malloc 更改为其他内容。在单线程服务器中,您可以简单地返回指向静态缓冲区的指针,在多线程中......这取决于情况。

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多