Почему сбой вызова RPC в программе на C, вызываемой из Groovy в Linux? - PullRequest
0 голосов
/ 27 августа 2010

У нас есть программа, написанная на 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 ]

1 голос
/ 27 августа 2010

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

def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
1 голос
/ 27 августа 2010

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

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

1 голос
/ 27 августа 2010

Запустите программу через <a href="http://linux.die.net/man/1/strace" rel="nofollow noreferrer">strace</a>, чтобы увидеть, какие системные вызовы (ы) дают сбой.

...