0

C で書かれたプログラムがあり、RPC を使用して、同じ Linux サーバー上の別のプログラム (これも C で書かれています) と通信します (一部の実稼働セットアップでは、2 番目の C プログラムは別のマシンにあるため、IPC ではなく RPC になります)。

他の C プログラム、CRON、またはコマンド ラインから呼び出された場合、期待どおりに動作し、長年にわたって動作しているため、一般的に動作すると言っても過言ではありません。

Groovy スクリプトから呼び出された同じプログラムが、明らかにネットワークの問題で失敗します。

C プログラムでは、svc_register(xprt, prognum, versnum, dispatch, protocol)成功しますが、

  • リクエスト後の RPC サーバー: clnttcp_create「接続が拒否されました」で失敗する
  • 応答を待っている RPC クライアント: selecton でsvc_fdset失敗しますEBADF

Groovy プログラム (完全を期すために、ここではあまり説明しません):

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

問題を特定して解決するには、どうすればよいでしょうか?

4

3 に答える 3

1

myprogram出力があるか、入力を待つかを確認します。出力を読み取らないか、入力を閉じないと、ハングし、RPC呼び出しでタイムアウトが発生します。in読み取りと終了errを行うスレッドを作成します。myprogramout

def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
于 2010-08-27T14:49:40.713 に答える
1

どうやら、Groovy からの RPC ベースの C プログラムの呼び出しは実際に機能します。

問題は、svc_fdset (rpc-requests からの応答を取得するために使用される構造体) 内の fds の数を決定するために使用される "(int)sysconf (_SC_OPEN_MAX)" が使用された場合に失敗するという問題に絞り込むことができます。 Groovy から呼び出される C プログラムによって。

于 2010-08-27T17:39:42.223 に答える
1

でプログラムを実行し、straceどのシステム コールが失敗しているかを確認します。

于 2010-08-27T14:30:28.853 に答える