Pourquoi un dans un programme C échec appel RPC appelé à partir Groovy sous Linux?

StackOverflow https://stackoverflow.com/questions/3585091

  •  01-10-2019
  •  | 
  •  

Question

Nous avons un programme écrit en C, qui utilise RPC pour communiquer avec un autre programme (également écrit en C) sur le même serveur Linux (dans certaines configurations de production, le deuxième programme C serait sur une autre machine, donc RPC au lieu de IPC).

Quand appelé d'autres programmes C, ou CRON la ligne de commande, il fonctionne comme prévu et a été fait depuis de nombreuses années, il est sûr de dire que cela fonctionne en général.

Le même programme, appelé à partir d'un script Groovy, échoue, apparemment avec des problèmes de réseau.

Dans le programme C, svc_register(xprt, prognum, versnum, dispatch, protocol) réussit, mais

  • sur le serveur RPC après la demande: clnttcp_create échoue avec "connexion refusée"
  • sur le client RPC en attente de réponse: select sur svc_fdset échoue avec EBADF

programme Groovy (juste pour être complet, pas grand-chose à voir ici):

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

Que pourrions-nous tenter d'identifier et de résoudre le problème?

Était-ce utile?

La solution

Apparemment, appel à des programmes C-basés sur RPC de Groovy ne fait le travail.

Le problème pourrait être réduit à la question « (int) sysconf (_SC_OPEN_MAX) », qui sert à déterminer le nombre de fds dans svc_fdset (une structure utilisée pour obtenir des réponses de requêtes RPC-) ne manque en cas d'être utilisé par un programme C appelé à partir routinier.

Autres conseils

Lancez le programme par strace, pour voir ce que l'appel système (s) est / sont défaillants.

Vérifiez si myprogram a une sortie ou attend l'entrée. Si vous ne lisez pas la sortie ou de fermer l'entrée, il se bloque, entraînant les délais d'attente dans l'appel RPC. Créer un fil qui se lit in et err de myprogram et à proximité out:

def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top