कृपया मेरे साथ नंगे, इस सवाल का एक सेटअप है।
मेरे OS पर, डिफ़ॉल्ट रूप से, ZSH के पास है -tostop
(या ट्टी है?)।
यह पृष्ठभूमि वाली प्रक्रियाओं को शेल में आउटपुट करने की अनुमति देता है जब उनके पास आउटपुट होता है।
इसलिये:
> stty -tostop
> echo "random" >/tmp/random
> cat /tmp/random &
[1] 7588
random
[1] + 7588 done cat /tmp/random
तदनुसार:
> stty tostop
> echo "random" >/tmp/random
> cat /tmp/random &
[1] 3888
[1] + 3888 suspended (tty output) cat /tmp/random
दस्तावेज़ीकरण पढ़ना और थोड़ा प्रयोग करना, मैंने पाया कि ZSH में 4 प्रकार की निलंबित प्रक्रियाएं हैं (आप इसका उपयोग करके देख सकते हैं kill -$SIGNAL $PID ; jobs
):
job state - signal that gives you job state
suspended - SIGTSTP
suspended (signal) - SIGSTOP
suspended (tty input) - SIGTTIN
suspended (tty output) - SIGTTOU
इसका मतलब यह होगा कि ए 3888
प्रक्रिया एक SIGTTOU संकेत प्राप्त कर रही है।
यह सब समझ में आता है।
अब मेरा सवाल यह है कि आखिर ऐसा क्यों है less
doesn "टी से प्रभावित हो stty tostop
या stty -tostop
?
> stty tostop
> less /tmp/random &
[1] 6300
[1] + 6300 suspended (tty output) less --LONG-PROMPT --chop-long-lines /tmp/random
> stty -tostop
> less /tmp/random &
[1] 4808
[1] + 4808 suspended (tty output) less --LONG-PROMPT --chop-long-lines /tmp/random
जैसा कि आप दोनों मामलों में देख सकते हैं, less
हमेशा पृष्ठभूमि में निलंबित हो रहा है।
अब, मुझे पता है less -X
, और मुझे वैकल्पिक स्क्रीन सुविधा के बारे में भी पता है जो टर्मिनल एमुलेटर के पास है। वास्तव में, आप ऊपर दिए गए 2 कमांड चला सकते हैं less -X
, और यह उसी तरह के निलंबन का परिणाम है। भले ही -X
यह वैकल्पिक स्क्रीन का उपयोग नहीं करता है, कम अभी भी मिलता है suspended (tty output)
!
मुझे पता है कि वास्तविक मैकेनिक कैसे है less
हमेशा से निलंबित किया जा रहा है suspended (tty output)
, यहां तक कि जब tostop
भीख माँग रहा है, और जब भी -X
भीख दी जा रही है। शेल को हमेशा कैसे भेजा जा सकता है SIGTTOU
सेवा मेरे less
, जब तक कि कोई और रास्ता न हो less
निलंबित हो रही है।
उत्तर:
उत्तर № 1 के लिए 1(आप अपना OS निर्दिष्ट नहीं करते हैं, लेकिन यह उत्तर लिनक्स पर आधारित है)
का उपयोग करते हुए strace
आप देख सकते हैं stty
कर रहा है ioctl
पर fd 0 (स्टडिन) में एक बिट टॉगल करें c_lflag
शब्दावली संरचना का मूल्य।
strace
यह भी पता चलता है less
खुलेगा /dev/tty
और जारी करें ioctl
इसे बदलने के लिए c_lflag
.
इसलिए less
बस के रूप में एक ही बात करता है stty tostop
कुछ भी उत्पादन करने से पहले।