سؤال

لدي بعض الأسئلة الأساسية حول الأنابيب التي لست متأكدًا منها.

أ) ما هو السلوك المعياري إذا تم قتل عملية تكتب إلى أنبوب (أي Sigkill Sigint) هل تغلق الأنبوب؟ هل هو مسح الأنبوب؟ أم أن السلوك غير محدد؟

ب) ما هو السلوك القياسي إذا كانت العملية تعود بشكل طبيعي؟ هل من المضمون مسح الأنبوب وإغلاق الأنبوب؟ (دون القيام بذلك صراحة بالطبع).

أود أن تكون هذه الإجابات عامة قدر الإمكان ، ولكن في الواقع إذا كان ذلك يعتمد كليا على مواصفات نظام التشغيل ، يمكنني قبول ذلك! ومع ذلك ، إذا كان هناك معيار POSIX أو سلوك Windows المحدد الحالي ، فسوف أكون ممتنًا جدًا لمعرفته.

شكرًا.

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

المحلول

أ. ما هو السلوك القياسي إذا تم قتل عملية كتابة إلى أنبوب (أي Sigkill Sigint) هل تغلق الأنبوب؟ هل هو مسح الأنبوب؟ أم أن السلوك غير محدد؟

Sigkill لا تسمح أبدًا لأي تنظيف - تموت العملية ، ميتة. مع sigint ، يعتمد ذلك على ما إذا كانت العملية تتعامل مع الإشارة. إذا كان الأمر كذلك ، فمن المحتمل أن يخرج عبر المخرج (2) ، والذي يمسح مقابض ملف I/O القياسية. السؤال هو - هل كان الأنبوب متصل بالإخراج القياسي أو عبر popen ()؟ إذا كان الأمر كذلك ، فإن البيانات المخزنة المتميزة مايو يتم مسحها ؛ إذا لم يكن الأمر كذلك ، فلا توجد بيانات مخزنة ، لذا فإن التدفق غير مادي.

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

ب. ما هو السلوك القياسي إذا كانت العملية تعود بشكل طبيعي؟ هل من المضمون مسح الأنبوب وإغلاق الأنبوب؟ (دون القيام بذلك صراحة بالطبع).

يعتمد ذلك على ما إذا كان الأنبوب متصلاً عبر الإدخال/الإخراج القياسي أم لا. إذا لم يكن كذلك ، فلا يوجد شيء معلق. إذا كان الأمر كذلك ، نعم ، سيتم مسح أي مادة في المخازن المؤقتة حيث يتم إغلاق دفق الإدخال/الإخراج القياسي.


ج. شكرًا على المعلومات حول الإشارات والبيانات غير المقروءة ، لكنني أشعر بالارتباك قليلاً بشأن اتصال الأنابيب I/O القياسي. بعد أن ذكرت Popen () نظرت إلى أعلى وتقول صفحة MAN إن قيمة إرجاعها متطابقة مع دفق الإدخال/الإخراج ويتم تخزين التدفقات بالكامل بشكل افتراضي. أنا لست واضحًا بشأن الفرق بين الاثنين ولا أفهم من أين يأتي الفرق.

دعوة النظام الأساسية لإنشاء الأنابيب pipe(2). يقوم بإنشاء واصفتين للملف ، أحدهما لنهاية القراءة للأنبوب ، واحدة لنهاية الكتابة. إذا لم تفعل شيئًا آخر معهم ، فإنها تظل كواصفات للملفات ، مع إخراج غير محدد (عبر الكتابة (2) ومكالمات النظام ذات الصلة). إذا أنهت العملية ، فلا يوجد تخزين مؤقت في التطبيق ؛ الأنبوب مغلق.

كما ترى popen(3), ، ثم يقوم بمزيد من العمل من أجلك. لا يزال يستدعي pipe(2) لإنشاء الأنابيب ، لكنه يقوم بعد ذلك fork(2). يرتب الطفل التكوين الصحيح للأنابيب ويطلق عملية الطفل. يقوم الوالد أيضًا بإغلاق الطرف غير المستخدم للأنبوب ، ويستخدمه fdopen(3) لإنشاء دفق ملف I/O قياسي لاستخدام عملية الاتصال.

مع دفق الملف ، إذا كانت هناك بيانات في المخزن المؤقت للإدخال/الإخراج ، فسيضمن إغلاق أو مكافئ أن يتم مسح البيانات المعلقة وإغلاق واصف الملف.

نصائح أخرى

السلوك الطبيعي هو أن جميع واصفات الملفات مغلقة عند تنتهي العملية. هذا يعني أن الأنبوب ، مثل أي واصف ملف مفتوح آخر ، مغلق بشكل طبيعي.

شيء مثير للاهتمام حول الأنابيب ، على الرغم من: في Posix ، إذا كتبت عملية إلى أنبوب تم إغلاقه ، فسوف يحصل الكاتب على إشارة ، Sigpipe.


يحرر:

التحذير: الفرق بين إنهاء SIGX والإنهاء العادي هو أنه ، مثل أي ملف آخر ، قد تفقد البيانات التي تم تخزينها (عبر كتابة ملف) ولم يتم كتابتها بعد إلى واصف الملف.

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