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

当从其他C程序,Cron或命令行调用时,它可以按预期工作,并且已经进行了很多年,因此可以肯定地说它可以正常工作。

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

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

  • 请求后在RPC服务器上: clnttcp_create 失败的“连接拒绝”
  • 在RPC客户端等待答复: selectsvc_fdset 失败 EBADF

Groovy程序(仅出于完整性,在这里看不到太多):

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

我们可以尝试查明和解决问题吗?

有帮助吗?

解决方案

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

该问题可以缩小到“(int)sysconf(_sc_open_max)”的问题,该问题用于确定SVC_FDSET中的FDS(用于从RPC-Requests获取答复的结构)中的FD数量确实失败了。由Groovy的C计划。

其他提示

运行程序 strace, ,查看系统调用是/正在失败。

检查是否 myprogram 具有输出或等待输入。如果您不读取输出或关闭输入,则将悬挂,从而导致RPC调用中的超时。创建一个读取的线程 inerrmyprogram 并关闭 out:

def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top