سؤال
عندما أبدأ وظيفة داخل قذيفة ERL ، تعمل بشكل جيد. عندما أحاول استدعاء نفس الوظيفة مع وظيفة وحدة ERL ... -S ، فإنها تفشل.
سطر الكود الذي يفشل في النهاية هو:
start(Port) ->
mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).
أنا متأكد من أن المنفذ يتم تعيينه بشكل صحيح. رسالة الخطأ الخاصة بي هي:
=CRASH REPORT==== 17-Jan-2010::00:21:09 ===
crasher:
initial call: mochiweb_socket_server:acceptor_loop/1
pid: <0.65.0>
registered_name: []
exception exit: {error,closed}
in function mochiweb_socket_server:acceptor_loop/1
ancestors: [mochiweb_http,<0.1.0>]
messages: []
links: []
dictionary: []
trap_exit: false
status: running
heap_size: 377
stack_size: 24
reductions: 93
neighbours:
لقد جربت مصحح الأخطاء ويتيح لي أن أتخطى اليمين حتى يتم إعطاء خط الرمز أعلاه. بعد مرور ذلك ، يعطيني تقرير التحطم هذا.
أي مساعدة يحظى بتقدير كبير.
المحلول
حسنًا ، أعتقد أن هذا يجب أن ينجح. هل يتم تجميع جميع الوحدات النمطية بنفس إصدار المترجم؟ IIRC قد تكون هناك أخطاء غريبة على مستوى المقبس إن لم يكن. راجع للشغل ، يمكنك الاتصال ببدء وظيفة نقطة الدخول الخاصة بك وهو الافتراضي لـ -s.
نصائح أخرى
بدلاً من ذلك يمكنك تجربة -eval
اختيار:
erl -eval 'module:start(9090).'
عند استخدام -S ، يتم جمع الوسائط في قائمة ، وبالتالي سيتم إرفاق المنفذ بالفعل في قائمة. يمكنك التحقق من كلتا الحالتين (قائمة أو int) مع دالة غلاف (مثل start([Port])
).
عندما تستخدم -S لتشغيل وظائف Erlang ، يتم وضع الوسائط في قائمة من ذرات. عندما تستخدم -run لتشغيل وظائف Erlang ، يتم وضع الوسائط في قائمة من سلاسل.
إذا كنت بحاجة إلى عدد صحيح قيمة لتمريرها ، ستحتاج إلى إجراء التحويلات المناسبة. إذا كنت ترغب في تغطية جميع الحالات ، فقد يساعد شيء من هذا القبيل:
start([Port]) when is_atom(Port) ->
start([atom_to_list(Port)]);
start([Port]) when is_list(Port) ->
start(list_to_integer(Port));
start(Port) when is_integer(Port) ->
mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).
استشر صفحة الرجل إرل ("Erl -Man Erl") للحصول على التفاصيل.