سؤال

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

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

المحلول

لا يمكنك حقًا التحكم في أحجام المخزن المؤقت. يمكنك المرور في القراءة وكتابة أحجام عازلة من 1 إلى CreateNamedPipe, ، لكن النواة ستزيد تلقائيًا من أحجام المخزن المؤقت. في الأساس ، سيكون المخزن المؤقت دائمًا أكبر على الأقل مثل أكبر كمية من البيانات التي كانت جاهزة للقراءة في أي وقت معين. بعبارة أخرى ، كلما زادت سرعة الاستجابة للبيانات ، وأصغر كتل البيانات المكتوبة إلى الأنبوب ، كلما تبقى المخزن المؤقت أصغر.

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

ومع ذلك ، لا أعتقد أن أحجام المخزن المؤقت مهمة حقًا. لا تؤخر الأنابيب إرسال البيانات إلى أن يكون المخزن المؤقت "ممتلئًا" ، ولا يوجد شيء يعادل خيار "Nagle" لـ TCP ، لذلك فإن الحفاظ على حجم مخزن مؤقت صغير لن يحسن زمن الوصول.

ضع في اعتبارك أنه عند توصيل أنبوب بتطبيق وحدة التحكم stdout, ، عادة ما يتم تخزين الإخراج عن طريق هذا التطبيق قبل إنه مكتوب إلى الأنبوب. إذا كنت تريد الإخراج غير المتجول ، فستحتاج إلى استخدام STDERR.

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

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