لماذا تفشل مكالمة RPC في برنامج C يسمى من Groovy on Linux؟
سؤال
لدينا برنامج ، مكتوب في 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()