سؤال

عندما تقوم بتوصيل عمليتين وتقتل الواحدة عند "مخرج" الأنبوب، تُستخدم العملية الأولى لاستقبال إشارة "الأنبوب المكسور"، والتي عادةً ما تنهيها أيضًا.على سبيل المثالجري

$> do_something_intensive | less

ومن ثم الخروج أقل يُستخدم لإعادتك على الفور إلى الغلاف المستجيب، على SuSE8 أو الإصدارات السابقة.عندما أحاول ذلك اليوم، do_something_intensive من الواضح أنه لا يزال قيد التشغيل حتى أقتله يدويًا.يبدو أن شيئًا ما قد تغير (عفويًا؟Shell ؟) الذي يجعل البرنامج يتجاهل "الأنابيب المكسورة" ...

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

يحرر :تكشف الاختبارات الإضافية (باستخدام strace) أن "SIGPIPE" يكون ولدت، ولكن هذا البرنامج لا ينقطع.بسيط

#include <stdio.h>
int main() 
{
   while(1) printf("dumb test\n");
   exit(0);
}

سوف تستمر مع ما لا نهاية

--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)

متى أقل قُتل.يمكنني بالتأكيد برمجة معالج الإشارة في برنامجي والتأكد من إنهائه، لكنني أبحث أكثر عن بعض متغيرات البيئة أو خيار الصدفة الذي من شأنه أن يجبر البرامج على الإنهاء على SIGPIPE

تحرير مرة أخرى:يبدو أنها مشكلة خاصة بـ tcsh (يتعامل معها bash بشكل صحيح) وتعتمد على المحطة الطرفية (Eterm 0.9.4)

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

المحلول 3

شكرا لنصائحكم، الحل يقترب..

وفقًا لصفحة إدارة tcsh، "ترث الأصداف التي لا تسجل الدخول سلوك الإنهاء من والديها.الإشارات الأخرى لها القيم التي ورثتها الصدفة من أصلها."

التي توحي لي صالة هو في الواقع أصل المشكلة..إذا تجاهلت SIGPIPE، فإن الصدفة نفسها ستتجاهل SIGPIPE أيضًا...

يحرر: لدي تأكيد نهائي بأن المشكلة تنشأ فقط مع Eterm+tcsh ووجدت إشارة مفقودة بشكل مريب (SIGPIPE,SIG_DFL) في كود مصدر Eterm.أعتقد أن إغلاق هذه القضية.

نصائح أخرى

حسنًا، إذا كانت هناك محاولة للكتابة على الأنبوب بعد رحيل القارئ، فسيتم إنشاء إشارة SIGPIPE.يتمتع التطبيق بالقدرة على التقاط هذه الإشارة، ولكن إذا لم يحدث ذلك، فسيتم إيقاف العملية.

لن يتم إنشاء SIGPIPE حتى تحاول عملية الاستدعاء الكتابة، لذلك إذا لم يكن هناك المزيد من المخرجات، فلن يتم إنشاؤها.

هل تغير مبدأ "القيام بشيء مكثف" على الإطلاق؟

كما ذكر دانيال، فإن SIGPIPE ليست إشارة سحرية تفيد بأن "أنبوبك قد اختفى" ولكنها إشارة "محاولة جيدة، لم يعد بإمكانك قراءة/كتابة هذا الأنبوب".

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

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