हर बार जब कोई वर्चुअल कंसोल के लिए एक अलग आकार निर्धारित करता है, lessतो विंडो रिज़ॉल्यूशन को पहचानता है (मैं मान रहा हूं कि ...); उसके अनुसार, यह बदलता है कि इसे पाठ की कितनी पंक्तियों की कल्पना करनी चाहिए। उस पैरामीटर की गणना कैसे की जाती है?
हर बार जब कोई वर्चुअल कंसोल के लिए एक अलग आकार निर्धारित करता है, lessतो विंडो रिज़ॉल्यूशन को पहचानता है (मैं मान रहा हूं कि ...); उसके अनुसार, यह बदलता है कि इसे पाठ की कितनी पंक्तियों की कल्पना करनी चाहिए। उस पैरामीटर की गणना कैसे की जाती है?
जवाबों:
यदि आप किसी स्क्रिप्ट से जांचने का तरीका ढूंढ रहे हैं, तो आप इनमें से कुछ भी कर सकते हैं:
tput colsऔर tput lines, जैसा कि मैनेटवर्क बताता हैलेकिन यदि आप विवरण चाहते हैं, तो हम यहां जाते हैं:
वर्चुअल टर्मिनल (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उन चीजों की सूची के लिए जिन्हें आप टर्मिनल को करने के लिए कह सकते हैं।
यदि आप स्रोत कोड पर एक नज़र डालते हैं, तो आप लिनक्स पर खिड़की के आकार को पुनः प्राप्त करने के लिए 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
मुझे यकीन नहीं है कि अगर यह वह जानकारी है जिसकी आपको तलाश है। मुझे लगता है कि के lessलिए एक सिग्नल हैंडलर रजिस्टर करता है SIGWINCH। जब टर्मिनल का आयाम बदलता है, तो यह एक SIGWINCHसंकेत प्राप्त करता है और टर्मिनल के वर्तमान आयाम के लिए tty जानकारी की जांच करता है।
http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html