【问题标题】:RPC: how to exit svc_run() on macOS?RPC:如何在 macOS 上退出 svc_run()?
【发布时间】:2021-10-20 20:52:22
【问题描述】:

我在辅助线程中有一个简单的 ONC RPC 服务器。我的 C/C++ 应用程序将被移植到 Linux、macOS 和 Windows(计划通过 MinGW-w64)。 RPC 服务器在 Linux 和 macOS 上运行和测试;问题是我找不到任何方法来停止 macOS 上的辅助线程:svc_run() 卡在__select_nocancel 中,而且,正如它的名字一样,我找不到取消它的方法。

这是我尝试过的:

  • svc_run() 替换为my own select loop,并添加the self-pipe trick。这在 macOS 和 Linux 上都很好用,但是由于未知原因,RPC 调度程序 svc_getreqset() 没有调用我的服务(Linux 和 macOS 都没有)。
  • 在线程上调用 pthread_cancel()(适用于 Linux,不适用于 macOS)。
  • 调用 pthread_kill() 将 SIGUSR1 发送到线程(适用于 Linux,不适用于 macOS)。
  • 通过 localhost 向自己发送一个特殊的 RPC 调用,并让服务器在收到后自行终止(在 Linux 上工作,而不是在 macOS 上工作,但无论如何它太复杂了)。

我愿意接受任何和所有建议!

提前致谢!

【问题讨论】:

    标签: linux macos rpc


    【解决方案1】:

    第一个解决方案(自定义 select() 循环和自管道技巧退出)显然是最好的解决方案,所以我专注于找出 svc_getreqset() 出了什么问题。

    该方法可能比结果更有趣:在 Ubuntu 中,我将 installed the source code 用于 glibc,其中包含 RPC 的东西。然后我可以使用调试器追踪到svc_run(),看看它与我的自定义select()循环有何不同。

    答案很简单(当然):当我们在 RPC 服务传输(SVCXPRT 结构)上获得连接请求时,它所做的第一件事就是为由accept() 打电话。然后需要将其包含在select() 中才能实际读取请求。我没有那样做。呵呵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 2023-02-24
      • 2021-10-25
      • 1970-01-01
      • 2021-04-23
      • 2021-04-24
      • 1970-01-01
      • 2021-02-27
      相关资源
      最近更新 更多