تفرعات Ruby %x على Linux 64 بت، ولكن ليس على 32 بت، وبصيغة محددة فقط

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

  •  03-07-2019
  •  | 
  •  

سؤال

إليك بعض رموز روبي:

puts %x{ pstree #{$$} }   # never forks
puts %x{ pstree '#{$$}' } # forks on amd64 only

في نظام Ubuntu Dapper 32 بت، أحصل على هذا الإخراج:

t.rb---pstree
t.rb---pstree

الذي يجعله منطقيا بالنسبة لي.لكن في نظام Ubuntu Hardy 64 بت، أحصل على هذا:

t.rb---sh---pstree
t.rb---pstree

ما يظهر هنا هو أن روبي تفرعت قبل التنفيذ في حالة واحدة فقط.عندما أضع الكود في ملف وأقوم بتشغيله تحت strace -fF، يبدو أنه يستدعي هاردي 64 بت clone() (يحب fork()) قبل execve(), ، بينما في Dapper 32 بت، لا يفعل شيئًا من هذا القبيل.

إصدارات روبي الخاصة بي هي:

ruby 1.8.4 (2005-12-24) [i486-linux]
ruby 1.8.6 (2007-09-24 patchlevel 111) [x86_64-linux]

يجب أن أحاول مزج ومطابقة المترجمين الفوريين وأحجام أنظمة التشغيل والكلمات بشكل أكبر، لكن الأمر ليس سهلاً الآن لأنني لا أدير هذه الأجهزة.ربما يستطيع أحدكم أن يخبرني ما هو الفرق بين هذه الأوامر على نظام 64 بت، ناهيك عن سبب عملها بنفس الطريقة على نظام 32 بت.

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

المحلول

وروبي يؤدي التوسع قذيفة عند استخدام٪ X مع حجة واحدة (مثل تقومون به).

وهنا تخميني على ما يجري:

وروبي بفحص الأمر لتحديد ما إذا كان هناك أي أحرف خاصة التي من شأنها أن تؤدي إلى الحاجة لإجراء توسعة شركة شل، وإذا كان الأمر كذلك فإنه يدعو قذيفة للقيام بذلك. في المثال الثاني على علامات الاقتباس المفردة كافية لجعل روبي تريد الاتصال قذيفة للقيام التوسع، وبالتالي شوكة. في المثال الأول يمكن أن روبي تحديد أنه لا حاجة لتوسيع قذيفة كما يتضمن الأمر لم أحرف خاصة (بعد التوسع متغير)، وبالتالي لا شوكة. هناك حاجة إلى الفرق بين الروايتين ربما له علاقة مع التغيير الداخلي في كيفية يحاول روبي لتحديد وتوسيع قذيفة. أحصل على مفترق الطرق للمثال الثاني على روبي 1.8.5 على جهاز 32 بت.

[تحرير]

حسنا، أنا ألقيت نظرة على شفرة المصدر لروبي 1.8.4 و1.8.6 وكلا الإصدارين استخدام نفس المعايير لتحديد ما إذا كان أو لم يكن لاستدعاء قذيفة لأداء التوسع قذيفة، إذا كان أي من الأحرف التالية موجودة في سطر الأوامر سيتم استدعاء قذيفة عندما يتم توفير وسيطة واحدة إلى٪ س:

*?{}[]<>()~&|\\$;'`"\n

وروبي هو في الواقع استدعاء قذيفة في كلتا الحالتين (في المثال الذي يحتوي على علامتي الاقتباس)، والسبب كنت ترى نواتج مختلفة من pstree يرجع إلى الاختلافات في الأمر sh على آلات مختلفة، واحدة تدعو fork، والآخر لا. أن نرى هذا لنفسك، قم بتشغيل هذا الأمر على الجهازين:

/bin/sh -c "pstree $$"

وهذا هو الأمر الذي روبي تستخدم لتنفيذ pstree في المثال مع اقتباسات على الجهازين. يجب أن تشاهد bash---pstree على الجهاز 32 بت و bash---sh---pstree على الآخر.

وحتى الآن أنا الغريب، ما أدى لك لاكتشاف هذا الاختلاف، وأنه يسبب مشكلة؟

نصائح أخرى

لقد مررت بهذا الموقف من خلال تطوير عمل معالج غير متزامن يحتوي على سلسلة من العمليات الفرعية (الشوكة)، وقد حدث ذلك عندما كان السيد في المقدمة وتلقى إشارة SIGINT.

انا اجري:يضع "النتيجة هي %(مهمة متأخرة الوحش)"

وكان الإخراج فقط:"النتيجه هي "

  • نعم، أنا "فخ" SIGINT في السيد

أندريه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top