/ वैकल्पिक स्क्रीन और पृष्ठभूमि निलंबन के उपयोग के संबंध में ZSH में `बिल्ली` को लॉन्च करने से अलग` कम` कैसे होता है - टर्मिनल, सिग्नल, zsh, टर्मिनल-एमुलेटर, कम-यूनिक्स

वैकल्पिक स्क्रीन और पृष्ठभूमि निलंबन के उपयोग के संबंध में जेडएसएच में 'बिल्ली' लॉन्च करने से 'कम' लॉन्च करने से कैसे भिन्न होता है - टर्मिनल, सिग्नल, जेएसएच, टर्मिनल-एमुलेटर, कम-यूनिक्स

कृपया मेरे साथ नंगे, इस सवाल का एक सेटअप है।

मेरे 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 कुछ भी उत्पादन करने से पहले।