لماذا تفشل مكالمة RPC في برنامج C يسمى من Groovy on Linux؟

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

  •  01-10-2019
  •  | 
  •  

سؤال

لدينا برنامج ، مكتوب في C ، يستخدم RPC للتواصل مع برنامج آخر (مكتوب أيضًا في C) على نفس خادم Linux (في بعض إعدادات الإنتاج ، سيقوم برنامج C الثاني على جهاز آخر ، وبالتالي RPC بدلاً من IPC).

عندما يتم استدعاؤها من برامج C أو CRON أو خط الأوامر ، فإنها تعمل كما هو متوقع ، كما أنها كانت تفعل ذلك لسنوات عديدة ، لذلك من الآمن القول إنها تعمل بشكل عام.

نفس البرنامج ، الذي يطلق عليه من نص رائع ، يفشل ، على ما يبدو مع مشاكل الشبكة.

في برنامج C ، svc_register(xprt, prognum, versnum, dispatch, protocol) ينجح ، ولكن بعد ذلك

  • على خادم RPC بعد الطلب: clnttcp_create يفشل مع "رفض الاتصال"
  • على عميل RPC في انتظار الرد: select على svc_fdset فشل مع EBADF

برنامج Groovy (فقط من أجل الاكتمال ، وليس الكثير لرؤيته هنا):

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

ما الذي يمكن أن نحاول تحديده وإصلاح المشكلة؟

هل كانت مفيدة؟

المحلول

على ما يبدو ، فإن استدعاء برامج C المستند إلى RPC من Groovy يعمل بالفعل.

يمكن تضييق المشكلة إلى المشكلة التي تفيد بأن "(int) sysconf (_sc_open_max)" ، والذي يتم استخدامه لتحديد عدد FDS في svc_fdset (هيكل يستخدم للحصول على ردود من RPC-request) تفشل في حالة استخدامها بواسطة برنامج C يسمى من Groovy.

نصائح أخرى

تشغيل البرنامج من خلال strace, ، لمعرفة ما هو/فشل استدعاء النظام/الفشل.

تحقق مما إذا كان myprogram لديه الإخراج أو ينتظر المدخلات. إذا لم تقرأ الإخراج أو تغلق الإدخال ، فسيتم تعليقه ، مما يؤدي إلى مهلة في مكالمة RPC. قم بإنشاء موضوع يقرأ in و err من myprogram وأغلق out:

def p = [ "myprogram", "someoption", "someprogram" ].execute()
p.out.close()
p.consumeProcessOutput()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top