Почему сбой вызова RPC в программе на C, вызываемой из Groovy в Linux?

У нас есть программа, написанная на C, которая использует RPC для связи с другой программой (также написанной на C) на том же сервере Linux (в некоторых производственных установках вторая программа на C будет работать на другой машине, поэтому RPC вместо IPC).

При вызове из других программ на C, CRON или из командной строки, он работает как ожидалось и делал это много лет, поэтому можно с уверенностью сказать, что он в целом работает.

Эта же программа, вызываемая из скрипта Groovy, не работает, очевидно, из-за проблем с сетью.

В программе C svc_register(xprt, prognum, versnum, dispatch, protocol) успешно, но потом

  • на сервере RPC после запроса: clnttcp_create не удается с "соединение отказано"
  • на клиенте RPC в ожидании ответа: select на svc_fdset не удается с EBADF

Groovy программа (просто для полноты, не так много, чтобы увидеть здесь):

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

Что мы можем попытаться определить и устранить проблему?

3 ответа

Решение

Очевидно, что вызов C-программ на основе RPC из Groovy действительно работает.

Проблема может быть сужена до вопроса, что "(int)sysconf (_SC_OPEN_MAX)", который используется для определения количества fds в svc_fdset (структура, используемая для получения ответов от rpc-запросов), не работает в случае использования с помощью программы на C, вызываемой из Groovy.

Проверьте, myprogram имеет выход или ждет ввода. Если вы не прочитали вывод или не закрыли вход, он зависнет, что приведет к таймаутам в вызове RPC. Создать поток, который читает in а также err из myprogram и закрыть out:

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

Запустите программу через strace, чтобы увидеть, что системный вызов (ы) является / сбой.

Другие вопросы по тегам