कौन तय करता है कि कौन सा एप्लिकेशन कीबोर्ड से सिग्नल प्राप्त करता है?


16

टर्मिनल में कीबोर्ड से संकेतों की मेरी वर्तमान समझ है (मोटे तौर पर मेरी टिप्पणियों को Google पर क्या पाया जा सकता है, यह जानने की कोशिश करने पर आधारित):

  • उपयोगकर्ता Cc दबाता है
  • इसे बाइट के रूप में टर्मिनल के इनपुट बफ़र पर भेजा जाता है, जिसकी गणना c के 7 बिट ascii मान से 2 सबसे बाएं बिट्स को साफ करके की जाती है

इसके बाद यह वास्तव में धूमिल होना शुरू हो जाता है, क्योंकि कॉन्फ़िगरेशन क्या इनपुट का मतलब है कि टर्मिनल (स्ट्टी) में क्या संकेत दिया जाता है। मुझे लगता है कि इसका मतलब है कि टर्मिनल खुद प्रक्रिया को संकेत भेज रहा है। लेकिन मुझे यह भी पता है कि टर्मिनल उस एप्लिकेशन के बारे में नहीं जानता है जो उसे पढ़ रहा है।

टर्मिनल काम में कीबोर्ड से सिग्नल कैसे भेजते हैं?


1
अपने आप में एक जवाब नहीं है, लेकिन पढ़ने के लायक है: टीटीवाई ध्वस्त हो गया , चूक से।
डस्कवफ-एक्टिव-

जवाबों:


33

दबाने Cजबकि Ctrlदबाया जाता है एक कुंजी दबाने टर्मिनल एमुलेटर को keyrelease X11 घटना के बाद भेजता है।

उस घटना पर (आमतौर पर कीप वन), टर्मिनल एम्यूलेटर 0x3 बाइट ( ^C) को उसकी फाइल डिस्क्रिप्टर पर छद्म-ट्टी डिवाइस के मास्टर साइड पर लिखता है।

यदि isigडिवाइस की टर्मिनस सेटिंग चालू है और यदि intrसेटिंग उस 0x3 बाइट पर सेट है, तो कर्नेल टर्मिनल डिवाइस के अग्रभूमि प्रक्रिया समूह के सभी सदस्यों (अन्य विशेषता जो पीटीआई डिवाइस में संग्रहीत है) को SIGINT सिग्नल भेजता है । उस स्थिति में, 0x3 बाइट पेंटी के गुलाम पक्ष पर पढ़ने के लिए उपलब्ध नहीं होगी।

यह आम तौर पर इंटरैक्टिव गोले हैं जो setpgid()शेल नौकरियों के लिए प्रक्रिया समूह (के साथ ) बनाते हैं , और यह तय करते हैं कि किसको अग्रभूमि में रखा जाए ( tcsetpgrp()पीटीआई डिवाइस की उस विशेषता को सेट करने के लिए) या नहीं।

उदाहरण के लिए, जब आप एक इंटरैक्टिव शेल के संकेत पर चलते हैं:

foo | bar

खोल दो प्रक्रियाओं के साथ एक नया प्रक्रिया समूह शुरू करता है (जिसमें यह निष्पादित होता है fooऔर barएक पाइप के साथ उनकी स्टड / आउट जुड़ा होने के बाद) और उस समूह को अग्रभूमि में रखता है। यदि आप Ctrl-C दबाते हैं, तो दोनों प्रक्रियाएँ SIGINT प्राप्त करेंगी।

में:

foo | bar &

समान लेकिन प्रक्रिया समूह को अग्रभूमि में नहीं रखा गया है (और शेल भी इसके लिए इंतजार नहीं करता है ताकि आप अन्य कमांड में प्रवेश कर सकें)। उन प्रक्रियाओं को Ctrl-C पर SIGINT नहीं मिलेगा, लेकिन अगर उन्हें ट्टी डिवाइस से पढ़ने की कोशिश की जाती है, तो उन्हें निलंबित किया जा सकता है।

पर अधिक पढ़ने: प्रत्येक छद्म टर्मिनल (PTY) घटक (सॉफ्टवेयर, मास्टर साइड, दास पक्ष) की जिम्मेदारियां क्या हैं?


2
अमीर जवाब के लिए धन्यवाद। मैं उत्तर के मूल को फिर से समझने की कोशिश करूंगा कि मुझे यह समझ में आए: संकेत कर्नेल द्वारा भेजा जाता है, जो डिवाइस विशेषताओं में कॉन्फ़िगर किए गए इनपुट के लिए स्वयं tty डिवाइस की निगरानी कर रहा है (जो भी इसे कॉन्फ़िगर करना चाहता है) और कर्नेल इसे प्रक्रिया समूह में भेजता है जो डिवाइस विशेषताओं में भी कॉन्फ़िगर किया गया है (मुख्य रूप से एक सत्र नेता के कर्तव्यों में से एक के रूप में शेल)। मुझे उम्मीद है कि यह सही है।
calavera.info

1
@ calavera.info, हाँ यह सही है। एक सीरियल केबल के अंत में एक वास्तविक टर्मिनल के मामले में, कर्नेल उस 0x3 बाइट की तलाश कर रहा है जो तार से आ रहा है। एक छद्म टर्मिनल के लिए, मास्टर पक्ष तार को बदल देता है। और कर्नेल उस 0x3 बाइट के लिए देख रहा है जो टर्मिनल एमुलेटर द्वारा भेजे गए बाइट्स में है। किसी अन्य प्रश्नोत्तर के लिंक के साथ संपादित करें को और भी अधिक विवरणों के साथ देखें (इस तथ्य की तरह कि कर्नेल प्रसंस्करण एक मॉड्यूलर डिजाइन का हिस्सा है जो तब किया जाता है जब डिवाइस को "टर्मिनल" डिवाइस (टर्मिनल लाइन अनुशासन ) के रूप में उपयोग किया जाता है ।
स्टीफन हेज़ेलस

क्या टर्मिनल एमुलेटर के बजाय प्रश्न को टर्मिनल नहीं कहा गया ? मुझे नहीं लगता कि इससे बहुत फर्क पड़ता है, यह देखते हुए कि एमुलेटर का कार्य जितना संभव हो उतना टर्मिनल के रूप में कार्य करना है ...
टोबी स्पाइट

2
@ टॉबी, हाँ, चूंकि इन दिनों शायद ही कोई असली टर्मिनल का उपयोग करता है, मैंने ओपी का मतलब टर्मिनल इम्यूलेटर माना (उनमें से कई को "टर्मिनल" कहा जाता है)। अधिक जानकारी के लिए आपकी और लिंक किए गए प्रश्नोत्तर से ऊपर मेरी टिप्पणी भी देखें।
स्टीफन चेज़लस

1
@TobySpeight हां, मैं एक टर्मिनल के बारे में पूछ रहा था क्योंकि मैं सीरियल लाइन पर वास्तविक टर्मिनल के साथ काम कर रहा हूं, लेकिन दोनों मामलों के लिए जवाब और निम्नलिखित टिप्पणियां पूरी तरह से मान्य थीं।
calavera.info
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.