2012-02-16 13 views
6

बैश में जब मैं चलाने wc & या cat & कि में मानक चाहता है अभी की तरह एक आदेश, इसके साथमैं कैसे बता सकता हूं कि कोई बच्चा stdin के लिए पूछ रहा है या नहीं? मैं इसे रोकने के लिए कैसे कहूं?

[1] + रूका बिल्ली

यह कैसे पूरा किया है तुरंत वापस लौट? मैं एक प्रोग्राम को कैसे रोकूं जिसे मैंने निष्पादन के साथ शुरू किया था, और मैं इन कार्यक्रमों को पहली जगह रोकने के लिए कैसे जानूं? क्या यह बताने का कोई तरीका है कि ये कार्यक्रम stdin चाहते हैं?

धन्यवाद!

पीएस भी, के बारे में क्या है? मैंने हमेशा सोचा है, लेकिन यह वास्तव में Google के लिए मुश्किल है ...

+2

"हार्ड टू google" प्रतीकों के लिए +1 – Tim

+2

आपको इस प्रश्न का उत्तर मिल सकता है: [मुझे कैसे पता चलेगा कि सी प्रोग्राम का निष्पादन योग्य अग्रभूमि या पृष्ठभूमि में चलाया जाता है?] (Http://stackoverflow.com/ प्रश्न/2425005/कैसे-करें-i-know-if-an-c-programs-execable-is-run-in-foreground-or-background) –

उत्तर

1

setpgid() मैनुअल पृष्ठ बताता है कि यह कैसे काम करता है:

एक सत्र एक नियंत्रित टर्मिनल हो सकता है। किसी भी समय, सत्र में प्रक्रिया समूहों में से एक (और केवल एक) टर्मिनल के लिए अग्रभूमि प्रक्रिया समूह हो सकता है; शेष प्रक्रिया समूह पृष्ठभूमि में हैं। यदि टर्मिनल से सिग्नल उत्पन्न होता है (उदा। SIGINT उत्पन्न करने के लिए इंटरप्ट कुंजी टाइप करना), तो यह संकेत अग्रभूमि प्रक्रिया समूह पर भेजा जाता है। (termios(3) के विवरण के लिए संकेतों को उत्पन्न करने वाले वर्णों के लिए देखें।) केवल अग्रभूमि प्रक्रिया समूह टर्मिनल से read(2) हो सकता है; यदि पृष्ठभूमि प्रक्रिया समूह टर्मिनल से read(2) पर प्रयास करता है, तो समूह को SIGTSTP सिग्नल भेजा जाता है, जो इसे निलंबित करता है। tcgetpgrp(3) और tcsetpgrp(3) फ़ंक्शन का उपयोग अग्रभूमि प्रक्रिया नियंत्रण टर्मिनल के समूह को प्राप्त/सेट करने के लिए किया जाता है।

  1. जब आप एक नई पाइपलाइन बनाने के लिए, फोन setpgid() एक नई प्रक्रिया समूह में (की पीआईडी ​​के साथ पाइप लाइन के सभी सदस्यों को डाल करने के लिए:

तो क्या आप क्या करना चाहते है पीजीआईडी ​​के रूप में पाइपलाइन में पहली प्रक्रिया)।

  • उपयोग tcsetpgrp() प्रबंधन करने के लिए जो प्रक्रिया समूह अग्रभूमि में है - अगर आप & साथ पृष्ठभूमि में एक पाइप लाइन में कहें, तो आप फिर से खोल की अपनी प्रक्रिया समूह अग्रभूमि प्रक्रिया समूह बनाना चाहिए।

  • बच्चे प्रक्रियाओं की स्थिति जानने के लिए WNOHANG और WUNTRACED झंडे के साथ कॉल waitpid() - जो आप एक संदेश मुद्रित करने के लिए पार्टी की तरह की अनुमति देगा इस बारे में सूचित करेंगे जब वे SIGTSTP द्वारा बंद कर दिया जाता है।

  • +0

    आप, महोदय या महोदया, ऐसा किया। यह एक लंबा मैनुअल पेज है, संदर्भ के लिए धन्यवाद। मैं मदद नहीं कर सकता लेकिन ध्यान देता हूं कि आपके पास 73 पृष्ठ उत्तर हैं, लेकिन केवल तीन प्रश्न हैं: यह कुछ है! आप मुझे सम्मान और प्रेरित करते हैं। – Ziggy

    2

    यदि आप शैल काम करने के तरीके के समान व्यवहार करने के लिए प्रोग्राम तैयार करना चाहते हैं, तो अपने बच्चे को मारने के बाद setpgrp() पर कॉल करें। यह पृष्ठभूमि प्रोग्राम को अपने स्वयं के प्रक्रिया समूह में चलाने का कारण बनता है, और इसलिए एक अलग tty है। जब यह कंसोल में I/O करने का प्रयास करता है, तो उसे सिग्टिन या सिग्टो सिग्नल प्राप्त होंगे। SIGTTIN या SIGTTOU का डिफ़ॉल्ट व्यवहार सिगस्टॉप की तरह प्रक्रिया को रोकना है।

    अभिभावक के रूप में, आप यह पता लगा सकते हैं कि आपने waitpid() और WUNTRACED का उपयोग करके बाल प्रक्रियाओं को रोक दिया है या नहीं।

    +0

    'setpgrp()' को POSIX में अप्रचलित के रूप में चिह्नित किया गया है; यह ऐतिहासिक रूप से एसआईएसवी और बीएसडी सिस्टम में एक अलग हस्ताक्षर था। 'setpgid()' पसंदीदा इंटरफ़ेस है। – caf

    2

    -

    + संकेत केवल वर्तमान काम को संदर्भित करता है [संपादित मुख्य सवाल का जवाब के लिए अन्य उत्तर देखें]। आदेशों की प्रत्येक पाइपलाइन (जैसे कि foo | bar | baz) एक नौकरी है, जिसे जॉब्सपेक का उपयोग % वर्ण से शुरू करने के लिए किया जा सकता है। %1 नौकरी संख्या 1 है, %+ वर्तमान नौकरी है, और %- पिछली नौकरी है।

    बैश मैनुअल के Job Control section देखें।

    +0

    पहला पैराग्राफ गलत है। इसे "प्रक्रिया समूह के नियंत्रण टर्मिनल से" (या उसके करीब कुछ - मुझे सटीक विवरण भूलना चाहिए), "stdin (फ़ाइल descriptor 0) से" नहीं पढ़ना चाहिए। इससे बचने का एक बिल्कुल अच्छा तरीका फाइल डिस्क्रिप्टर 0 को गैर-टर्मिनल का संदर्भ देना है, उदा। कमांड लाइन पर '

    +1

    और यह 'सिग्टिन' के लिए डिफ़ॉल्ट कार्रवाई है, शेल नहीं, जो प्रक्रिया को निलंबित करता है। इसे सिग्नल हैंडलर से ओवरराइड किया जा सकता है। –

    +0

    मुझे लगता है कि यह मेरे प्रश्न का उत्तर नहीं देता है, जो बैश के बजाए सी के बारे में है। प्रक्रिया को कैसे निलंबित किया गया है, और मुझे कैसे पता चलेगा कि यह stdin से पढ़ रहा है। याद रखें, मैं परेशान हूँ। (आप पीएस भाग हालांकि जाते हैं! धन्यवाद!) – Ziggy

    0

    आप मैन्युअल काँटेदार बच्चे प्रक्रिया में system("command &") उपयोग कर सकते हैं और फिर इसे बाहर निकलने बनाने के लिए, अगर वहाँ कोई समय और प्राथमिकता की कमी कर रहे हैं।