سؤال

أستطيع كتابة البرامج النصية قذيفة هذا الفخ SIGINT على ما يرام, ولكن أنا لا يمكن أن يبدو فخ SIGQUIT.

#!/bin/bash

function die {
    echo "Dying on signal $1"
    exit 0
}

trap 'die "SIGINT"' SIGINT
trap 'die "SIGQUIT"' SIGQUIT

while true; do
    echo "sleeping..."
    sleep 5
done

تنفيذ هذا السيناريو و الضغط CTRL-C وقد التأثير المطلوب, ولكن الضغط CTRL-\ (وهو كما أفهم أن تؤدي SIGQUIT) لا يفعل شيئا إلا طباعة ^\ في المحطة.لماذا ؟

لدي اثنين من تشغيل النظريات.الأول هو أن دلالات SIGINT و SIGQUIT مختلفة مثل أن SIGQUIT فقط يتم إرسالها إلى عملية طفل sleep, في حين SIGINT يحصل إرسالها إلى كل عملية الطفل و الوالدين باش عملية.إذا كان هذا هو الحال ، أين هو موثق ؟

الثاني النظرية التي باش لا تتجاهل فقط (أي لا op معالج) SIGQUIT بشكل افتراضي (مثل صفحة يوحي) ، ولكن لا تسمح لها أن تكون المحاصرين في كل شيء.هذه نظرية التداخل مع النظرية الأولى ، لأنه يمكن أن يكون حال SIGQUIT هو الذهاب إلى كل من الأم والطفل ، ولكن الوالد (bash) فقط لا اعتراض عليه.إذا كان هذا هو الحال, هناك أي طريقة فخ SIGQUIT في باش السيناريو ؟ ...ربما بعض shopt يمكن أن أحدد ؟

تحرير:هذا هو على أوبونتو 10.10 في gnome-terminal 2.32.0 تشغيل باش 4.1.5, ونعم ^\ تم تكوين المسألة SIGQUIT (كما ذكرت من قبل stty -a وأكد خلال إصدار ^\ SIGQUITs إلى برامج أخرى مثل ping).

تحديث:أنا فقط اكتشفت أن المشكلة يجب أن يكون راجعا بطريقة أو بأخرى إلى gnome-terminal.إن تشغيل هذا البرنامج النصي من وحدة التحكم الظاهرية (أي ، ctrl-alt-f1 للخروج من X) ، الفخاخ SIGQUIT على ما يرام تماما عندما اضغط ^\.نفس باش كل شيء ، حتى الفرق الوحيد يجب أن يكون محطة المحاكي.حتى الآن يصبح السؤال:كيف يمكنني تكوين gnome-terminal تتصرف مثل وحدة التحكم الظاهري في هذا الصدد ؟ أنا diff'د مخرجات stty -a في وحدة التحكم الظاهري في gnome-terminal ، في حين أن هناك اختلافات ، لا شيء يبدو على الفور ذات الصلة (على سبيل المثال ، على حد سواء لديهم quit = ^\;).

تحديث 2:تجربة أخرى.ببساطة تنفيذ $ sleep 60 في gnome-terminal;اضغط ^\ و تذهب إشارة غير مسك.الآن تنفيذ $ sleep 60 في وحدة التحكم الظاهري;اضغط ^\ و الإشارة هو اشتعلت -- عملية طباعة Quit والمخارج.ولكن الآن تشغيل $ ping google.com في gnome-terminal ثم اضغط ^\ -- إشارة اشتعلت والتعامل معها كما هو متوقع.حتى لا يكون هناك شيء غريب حول gnome-terminal هذه SIGQUIT يمكن أن تكون اشتعلت من قبل بعض البرامج ، ولكن ليس قبل الآخرين ، حتى لو كانت تلك الأخرى الآخرين هل قبض عليه عند استدعاء من وحدة التحكم الظاهري.ربما يجب فقط ترقية gnome-terminal.

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

المحلول

أستطيع إلا أن نفترض أن هذا كان نوعا من الخلل في gnome-terminal 2.32.0;لدي منذ ترقيتها إلى أوبونتو 11.04, مع gnome-terminal 2.32.1 (و باش 4.2.8) و SIGQUIT الآن محاصرا كما هو متوقع.

نصائح أخرى

ألاحظ نفس السلوك على فيدورا 19 مع XFCE:وفقا ps s, باش في xfce4-المحطة قد SIGQUIT تجاهل تشغيل yes >/dev/null & ثم ps s يظهر أنه حتى subprocess وقد SIGQUIT تجاهلها.عندما كنت (من نفس المحطة) تشغيل ssh localhost, شل في ssh الدورة أيضا SIGQUIT تجاهلها ، ولكن yes >/dev/null & وقد لا.

على ضوء ما سبق التعليق الذي يذكر gnome-terminal, أعتقد أن الخلل هو في الجزء المشترك من اثنين من المحطات:على vte المكتبة.لي vte-0.28.2-9.fc19.x86_64.

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