ماذا يعني: "يمكن أن ترث عملية الطفل بالمقبض"؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

هناك بعض كائنات Win32 التي وفقا لل SDK يمكن "تورثها" لعمليات الأطفال التي تم إنشاؤها بواسطة العملية المحددة. (الأحداث، Mutexes، أنابيب، ...)

ماذا يعني ذلك في الواقع؟

دعنا نقول أن لدي كائن حدث مسمى، تم إنشاؤه CreateEvent, ، مرة واحدة مع bInheritHandle == true, ووقت آخر == false.

الآن أبدأ عملية الطفل. كيف يؤثر هذان مقابض الحدثان على عملية الطفل؟ في أي سيناريوهات تختلف؟

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

المحلول

إذا قمت بإنشاء / فتح كائن واسمح بهذا التعامل معه، فإن العمليات الطفولة المسموح لها براون مقابض (على سبيل المثال، يمكنك تحديدها bInheritHandles = TRUE للحصول على CreakeProcess) سيكون لها نسخ من تلك المقابض. ستحصل هذه المقابض الموروثة على نفس قيم المقبض مثل مقابض الأصل. لذلك على سبيل المثال:

  • CreateEvent إرجاع مقبض كائن الحدث، ومقبض هو 0x1234.
  • تسمح لهذا التعامل معها.
  • يمكنك إنشاء عملية تابعة لها التي ترث مقابضك.
  • أن عملية الطفل يمكن الآن استخدام مقبض 0x1234 دون الحاجة إلى الاتصال CreateEvent أو OpenEvent. وبعد يمكنك على سبيل المثال تمرير قيمة المقبض في سطر الأوامر في عملية الطفل.

هذا مفيد لكائنات Unnamed - نظرا لأنها Unnamed، فإن العمليات الأخرى لا يمكن فتحها. باستخدام تعامل مع معالجة العمليات الفرعية يمكن الحصول على مقابض إلى الكائنات غير المشمس إذا كنت تريدها.

نصائح أخرى

نقطة واحدة التي لم يتم إجراؤها في الإجابات الحالية هي أن السماح لعملية تابعة لورث المقابض لا تؤثر فقط على عملية الطفل؛ قد يؤثر أيضا على مدى حياة الكائن الذي يشير إليه المقابض. إذا خرجت العملية الأصل، فإن المقابض في عملية الطفل ستبقي الكائن حيا.

عند السماح لعملية تابعة لترث المقابض، يجب أن تنظر فيما إذا كان سيؤدي إلى كائن يعيش لفترة أطول مما ينبغي؛ على سبيل المثال، تريد بعض التطبيقات فقط السماح بمثيل واحد للتشغيل في كل مرة، وقد تقوم بذلك عن طريق إنشاء كائن حدث مع اسم معين ورؤيته ما إذا كان موجودا بالفعل. إذا قاموا بإنشاء عملية تابعة للرجال الذين يرثون كائن الحدث، ويزداد الوالد، فقد يؤدي ذلك إلى إيجابي كاذب.

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

لهذا السبب، أفضل الممارسات هي:

من ناحية أخرى، يمكن أن يكون هذا من حين لآخر مفيدا؛ على سبيل المثال، إذا كنت تريد العملية الفرعية للعناية كمثال للعملية الأصلية، أو للحصول على ملف لا يزال يتعذر الوصول إليه حتى خرج الطفل. هناك خدعة أخرى هي أن يكون لديك طفل يرث مقبضا كائن يدعى ثم استخدم وجود أو عدم وجود الكائن لتحديد ما إذا كان الطفل لا يزال حيا، دون الحاجة إلى المرور حول مقبض العملية أو معرف العملية.

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

تحرير: إزالة التضليل.

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