निलंबित होने के बाद कुछ समय के लिए लूप क्यों बंद हो जाता है?


10

ऐसा क्यों है कि बैश का उपयोग करते हुए और थोड़ी देर के लूप को निलंबित करने के बाद लूप फिर से शुरू हो जाता है? नीचे छोटा उदाहरण।

$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+  Stopped                 sleep 1
$ fg
sleep 1
$

मैं संकेतों से परिचित हूं, और मैं यह अनुमान लगा रहा हूं कि यहां पर मारपीट का स्वाभाविक व्यवहार हो सकता है, लेकिन मैं बेहतर तरीके से समझना चाहता हूं कि यह इस विशेष तरीके से व्यवहार क्यों करता है।


क्योंकि इसे एक रुकावट को संभालना पड़ता है और इसे सही ढंग से प्रतिबिंबित करना पड़ता है कि $?वापसी में, और ऐसा trueनहीं है true। शायद। मुझे लगता है।
13

1
मुझे उम्मीद है कि इस टिप्पणी को ध्वजांकित नहीं किया जाएगा, लेकिन मैं आपके प्रश्न का उत्तर एक और प्रश्न, यूनिक्स को-शैली के साथ दूंगा: "एक छात्र निलंबित होने के बाद खेल के मैदान पर लड़ना क्यों बंद कर देता है?" जवाब दिया जा रहा है, क्योंकि वह अब खेल के मैदान में नहीं है, जहां वह झगड़े शुरू करने की क्षमता रखता है। इस प्रकार, प्रश्न में व्यवहार केवल रुका हुआ है।
रुबिनोरेल्स

आप कमांड को रोकते हैं, लूप टूट जाता है। फिर आप सिंगल स्लीप 1 कमांड को फिर से शुरू करते हैं, लूप को नहीं।
123

जवाबों:


10

यह कई गोले में एक बग की तरह दिखता है, यह ksh93 और zsh के साथ अपेक्षित के रूप में काम करता है ।

पृष्ठभूमि:

अधिकांश शेल मुख्य शेल के अंदर लूप चलाते समय लगते हैं और

यदि आप गैर-लॉगइन शेल के साथ ^ Z टाइप करते हैं तो बॉर्न शेल पूरे शेल को निलंबित कर देता है

बैश केवल निलंबित करता है sleepऔर फिर एक नया शेल प्रॉम्प्ट प्रिंट करने के पक्ष में जबकि लूप छोड़ देता है

डैश इस आदेश को बिना सोचे समझे बनाता है

Ksh93 के साथ , चीजें बहुत अलग हैं:

ksh93 वही करता है, जबकि कमांड को पहली बार शुरू किया जाता sleepहै , लेकिन जैसा कि ksh93 में एक buitin है, ksh93 में एक हैंडलर है, जो मुख्य लूप को बंद करने के लिए लूप का कारण बनता है और फिर उस समय निलंबित कर देता है जब आप ^ Z।

यदि आप बाद में ksh93 टाइप करते हैं fg, तो बंद बच्चा जो अभी भी लूप चलाता है, जारी है।

बैश और ksh93 से जॉबकंट्रोल संदेशों की तुलना करते समय आप मुख्य अंतर देखते हैं:

बैश रिपोर्ट:

[1]+ Stopped sleep 1

लेकिन ksh93 रिपोर्ट:

^Z[1] + Stopped while true; do echo .; sleep 1; done

zsh के लिए इसी तरह बर्ताव करता है ksh93

दोनों गोले के साथ, आपके पास एक ही प्रक्रिया (मुख्य शेल) है जब तक आप ^ Z टाइप नहीं करते हैं, और दो शेल प्रक्रियाएँ टाइप करते हैं।


dashजब लूप समाप्त हो जाता है तो वास्तव में सिग्नल को संभालने से हवा नहीं चलती है? [d]?ashस्रोत कोड में INTON और INTOFF के लिए इन सभी मैक्रोज़ को फैलाया गया है, और आम तौर पर एक इंफ़ोफ़ राज्य में रहते हुए प्राप्त संकेतों को वास्तव में (या आसपास) INTON में संभाला जाता है । वैसे भी, मैं केवल उत्सुक कारण हूँ जो मुझे लगता है कि आप बेहतर जानते हैं - यह एक महान जवाब है। धन्यवाद।
16

मैं शायद ही कभी डैश का उपयोग करता हूं और मैंने हाल ही में इसे प्राप्त किया और इसे बैश, ksh93 और मेरे बॉर्न शेल के साथ प्रदर्शन तुलना के लिए संकलित किया। इन परीक्षणों को करते समय, मैंने पाया कि डैश मुख्य रूप से तेज़ लगता है क्योंकि इसमें मल्टी बाइट पात्रों के लिए समर्थन शामिल नहीं है। एक एकल sleep 100को निलंबित और फिर से शुरू किया जा सकता है dash, इसलिए ऐसा लगता है कि dashइस आदेश में समस्याओं के बारे में पता है और चुनिंदा रूप से नौकरी नियंत्रण को अक्षम करता है।
श्लोक

इसलिए, आपके परीक्षणों में, आप dashमल्टीबाइट प्रसंस्करण को छोड़ कर अन्य गोले में प्रदर्शन को बराबर करने में सक्षम थे ? और हाँ, dashनौकरी नियंत्रण का समर्थन करता है, लेकिन मानक का कहना है कि एक इंटरेक्टिव शेल को TSTP को अनदेखा करना चाहिए, और एक इंटरेक्टिव टर्मिनल पर वर्तमान शेल में कुछ समय के लिए चल रहा है, किसी भी अन्य की तुलना में एक इंटरैक्टिव शेल कम नहीं है।
मिकसेर

मैंने इसका ठीक-ठीक परीक्षण नहीं किया, लेकिन मैं देख सकता था कि डैश ksh93 या बॉर्न शेल की तुलना में अधिक सिस्टम CPU समय की खपत करता है (मुख्यतः क्योंकि यह अधिक कांटा () कॉल जारी करता है), यह उपयोगकर्ता के CPU समय का कम उपयोग करता है और इसका परिणाम समान होता है बॉर्न शेल के मेरे संस्करण की तुलना में सीपीयू समय। बॉर्न शेल में उपयोगकर्ता सीपीयू समय को कम करने की कोशिश करने से, मुझे पता है कि इस समय का अधिकांश भाग मल्टीबाइट रूपांतरणों में खर्च होता है।
श्लोक

4

मैंने इस मुद्दे के बारे में बैश के सह-लेखकों में से एक को लिखा, और यहां उनका जवाब है:

यह वास्तव में एक बग नहीं है, लेकिन यह निश्चित रूप से एक चेतावनी है।

यहां विचार यह है कि आप प्रक्रियाओं को स्थगित कर देते हैं, जो शेल कमांड की तुलना में ग्रैन्युलैरिटी की एक अलग इकाई है। जब किसी प्रक्रिया को निलंबित कर दिया जाता है, तो यह शेल पर वापस लौटता है (एक गैर-शून्य स्थिति के साथ, जिसके परिणाम तब होते हैं जब आप कहते हैं, एक प्रक्रिया रोकें जो लूप टेस्ट है), जिसमें एक विकल्प है: यह बाहर निकल सकता है या लूप जारी रख सकता है , पीछे रुकी हुई प्रक्रिया को छोड़कर। बैश चुनता है - और हमेशा चुना है - जब नौकरी बंद हो जाती है तो लूप से बाहर निकलने के लिए। लूप को जारी रखना शायद ही कभी आप चाहते हैं।

कुछ अन्य गोले SIGTSTP के कारण किसी प्रक्रिया के स्थगित होने पर शेल की एक प्रतिलिपि की तरह काम करते हैं, और उस प्रक्रिया को रोक देते हैं। बैश कभी नहीं किया है कि - यह लाभ वारंट की तुलना में अधिक जटिल लगता है - लेकिन अगर कोई पैच के रूप में उस कोड को प्रस्तुत करना चाहता है, तो मैं परिवर्तनों को शामिल करने पर एक नज़र डालूंगा।

इसलिए अगर किसी को एक पैच जमा करना है, तो मैन पेज में पाए गए ईमेल पतों का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.