टर्मिनल रिज़ॉल्यूशन को कम कैसे जानता है?


14

हर बार जब कोई वर्चुअल कंसोल के लिए एक अलग आकार निर्धारित करता है, lessतो विंडो रिज़ॉल्यूशन को पहचानता है (मैं मान रहा हूं कि ...); उसके अनुसार, यह बदलता है कि इसे पाठ की कितनी पंक्तियों की कल्पना करनी चाहिए। उस पैरामीटर की गणना कैसे की जाती है?


उम्म ... ठीक है, फिर भी मुझे वह प्रक्रिया कहां मिल सकती है जिसे निष्पादित किया गया है?
Giuseppe Crinò

जवाबों:


22

यदि आप किसी स्क्रिप्ट से जांचने का तरीका ढूंढ रहे हैं, तो आप इनमें से कुछ भी कर सकते हैं:

  • रन tput colsऔर tput lines, जैसा कि मैनेटवर्क बताता है
  • $ LINES और $ COLUMNS के मूल्यों की जाँच करें

लेकिन यदि आप विवरण चाहते हैं, तो हम यहां जाते हैं:

वर्चुअल टर्मिनल (xterm, et al) के लिए एक ioctl()सिस्टम कॉल है जो आपको बताएगा कि विंडो किस आकार की है। यदि यह कर सकता है, lessइस कॉल का उपयोग करता है। इसके अलावा, जब आप विंडो का आकार बदलते हैं, तो उस विंडो में जो कुछ भी चल रहा है वह एक SIGWINCHसंकेत प्राप्त करता है lessजो आपको यह बताता है कि इसे नए विंडो आकार के लिए जांचना चाहिए। उदाहरण के लिए, मैंने एक lessरनिंग (प्रक्रिया आईडी 16663 के रूप में) शुरू की, इसके साथ जुड़ा हुआ है strace, और खिड़की का आकार बदल दिया है। यह वही है जो मैंने देखा:

$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1)                  = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0

यह भी है कि पर्दे के पीछे क्या tput colsऔर tput linesक्या किया जा सकता है। इस पद्धति की अधिक जानकारी के man tty-ioctlलिए, TIOCGWINSZ देखें और खोजें।

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

  • LINESऔर COLUMNSअक्सर टर्मिनल आयामों पर सेट किया जाएगा। वास्तव में, अगर bashया zshटर्मिनल आयाम पा सकते हैं , तो यह स्वचालित रूप से इन चरों को स्वयं सेट कर देगा, ताकि टर्मिनल आकार को देखने के लिए नॉट-सोफ्ट प्रोग्राम को आसान बनाया जा सके। हालांकि, अधिकांश अन्य गोले, सहित dashऔर tcsh, इन चर को सेट नहीं करते हैं।
  • TERMआमतौर पर टर्मिनल प्रकार पर सेट होता है, जिस स्थिति में टर्मिनल डेटाबेस में टर्मिनल का अपेक्षित आकार हो सकता है। यदि tput rowsआप IOCTL का उपयोग नहीं कर सकते हैं (उदाहरण के लिए, यदि आप एक सीरियल पोर्ट से जुड़े हैं), तो यह यहां दर्ज किए गए मानों पर वापस गिर जाएगा। एक टर्मिनल के लिए जिसका आकार बदल सकता है, यह केवल एक अनुमान है और गलत होने की संभावना है।

अधिक जानकारी के लिए, man tputटर्मिनल को नियंत्रित करने के लिए कमांड देखें और man terminfoउन चीजों की सूची के लिए जिन्हें आप टर्मिनल को करने के लिए कह सकते हैं।


टर्मोफ डेटाबेस ऐसा नहीं करता है जो यहां इंगित किया गया था। @ Warl0ck द्वारा उत्तर, जिसमें कम जानकारी है, अधिक सटीक है।
थॉमस डिकी

@ThomasDickey आप सही कह रहे हैं; सभी में अपेक्षित मूल्य हैं। मेरा उत्तर ठीक कर दिया; धन्यवाद।
जैंडर

7

यदि आप स्रोत कोड पर एक नज़र डालते हैं, तो आप लिनक्स पर खिड़की के आकार को पुनः प्राप्त करने के लिए lessकॉल करेंगे ioctl()

#ifdef TIOCGWINSZ
    {
        struct winsize w;
        if (ioctl(2, TIOCGWINSZ, &w) == 0)
        {
            if (w.ws_row > 0)
                sys_height = w.ws_row;
            if (w.ws_col > 0)
                sys_width = w.ws_col;
        }
    }
#else
#ifdef WIOCGETD
    {
        struct uwdata w;
        if (ioctl(2, WIOCGETD, &w) == 0)
        {
            if (w.uw_height > 0)
                sys_height = w.uw_height / w.uw_vs;
            if (w.uw_width > 0)
                sys_width = w.uw_width / w.uw_hs;
        }
    }
#endif

1

मुझे यकीन नहीं है कि अगर यह वह जानकारी है जिसकी आपको तलाश है। मुझे लगता है कि के lessलिए एक सिग्नल हैंडलर रजिस्टर करता है SIGWINCH। जब टर्मिनल का आयाम बदलता है, तो यह एक SIGWINCHसंकेत प्राप्त करता है और टर्मिनल के वर्तमान आयाम के लिए tty जानकारी की जांच करता है। http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html

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