【问题标题】:Why does an RPC call fail in a C program called from Groovy on Linux?为什么在 Linux 上从 Groovy 调用的 C 程序中的 RPC 调用失败?
【发布时间】:2011-04-04 20:19:32
【问题描述】:

我们有一个用 C 编写的程序,它使用 RPC 与同一 Linux 服务器上的另一个程序(也用 C 编写)进行通信(在某些生产设置中,第二个 C 程序将在另一台机器上,因此 RPC 而不是IPC)。

当从其他 C 程序、CRON 或命令行调用时,它按预期工作,并且已经这样做了很多年,所以可以肯定地说它通常工作。

从 Groovy 脚本调用的同一程序失败,显然是网络问题。

在C程序中,svc_register(xprt, prognum, versnum, dispatch, protocol)成功了,但是之后

  • 请求后在 RPC 服务器上:clnttcp_create 失败并显示“连接被拒绝”
  • 在等待回复的 RPC 客户端上:select on svc_fdset 失败并显示 EBADF

Groovy 程序(只是为了完整,这里不多见):

[ "myprogram", "someoption", "someprogram" ].execute()

我们可以尝试找出并解决问题?

【问题讨论】:

    标签: linux groovy rpc sunrpc


    【解决方案1】:

    显然,从 Groovy 调用基于 RPC 的 C 程序确实有效。

    问题可以缩小到“(int)sysconf (_SC_OPEN_MAX)”的问题,它用于确定 svc_fdset(用于从 rpc-requests 获取回复的结构)中的 fd 数量,以防万一被从 Groovy 调用的 C 程序使用。

    【讨论】:

      【解决方案2】:

      通过@987654321@ 运行程序,查看失败的系统调用。

      【讨论】:

        【解决方案3】:

        检查myprogram是否有输出或等待输入。如果您不读取输出或关闭输入,那么它将挂起,导致 RPC 调用超时。创建一个线程,读取myprograminerr 并关闭out

        def p = [ "myprogram", "someoption", "someprogram" ].execute()
        p.out.close()
        p.consumeProcessOutput()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-25
          • 2018-01-29
          • 2015-11-21
          • 2019-08-06
          • 1970-01-01
          • 2016-12-09
          相关资源
          最近更新 更多