প্রতিবার কেউ ভার্চুয়াল কনসোলের জন্য আলাদা আকার নির্ধারণ করে, lessউইন্ডো রেজোলিউশনটি স্বীকৃতি দেয় (আমি ধরে নিচ্ছি যে ...); সেই অনুসারে, এটি পাঠ্যের কতগুলি লাইনকে ভিজ্যুয়ালাইজ করা উচিত তা পরিবর্তন করে। সেই পরামিতিটি কীভাবে গণনা করা হয়?
প্রতিবার কেউ ভার্চুয়াল কনসোলের জন্য আলাদা আকার নির্ধারণ করে, lessউইন্ডো রেজোলিউশনটি স্বীকৃতি দেয় (আমি ধরে নিচ্ছি যে ...); সেই অনুসারে, এটি পাঠ্যের কতগুলি লাইনকে ভিজ্যুয়ালাইজ করা উচিত তা পরিবর্তন করে। সেই পরামিতিটি কীভাবে গণনা করা হয়?
উত্তর:
আপনি যদি কোনও স্ক্রিপ্ট থেকে চেক করার কোনও উপায় খুঁজছেন, আপনি এইগুলির মধ্যে যে কোনওটি করতে পারেন:
tput colsএবং tput lines, ম্যানটওয়ার্কের পরামর্শ অনুসারেতবে আপনি যদি বিশদ চান, এখানে আমরা যাচ্ছি:
ভার্চুয়াল টার্মিনালগুলির জন্য (xterm, et al) একটি ioctl()সিস্টেম কল রয়েছে যা জানায় যে উইন্ডোটি আকার size যদি এটি করতে পারে তবে 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জন্য দেখুন এবং টিআইওসিজিউইউএনএসজেড অনুসন্ধান করুন।
অন্যান্য টার্মিনালগুলির জন্য যেমন সিরিয়াল পোর্টগুলির সাথে সংযুক্ত রয়েছে তাদের পক্ষে এই তথ্যটি সরাসরি পাওয়ার কোনও উপায় নেই। সেক্ষেত্রে, lessএনভায়রনমেন্ট ভেরিয়েবল মধ্যে সংকেত সনাক্ত করুন খুঁজছেন শুরু।
LINESএবং COLUMNSপ্রায়শই টার্মিনাল মাত্রায় সেট করা হবে। প্রকৃতপক্ষে, যদি bashবা zshটার্মিনালের মাত্রা সন্ধান করতে পারে তবে এটি স্বয়ংক্রিয়ভাবে এই ভেরিয়েবলগুলি সেট করে দেবে, না-চালাক প্রোগ্রামগুলির পক্ষে টার্মিনালের আকার দেখতে সহজ করে তোলে। যাইহোক, dashএবং অন্যান্য বেশিরভাগ শেলগুলি tcshএই ভেরিয়েবলগুলি সেট করে না।TERMসাধারণত টার্মিনাল টাইপ সেট করা হয়, সেক্ষেত্রে টার্মিনো ডাটাবেসে টার্মিনালের প্রত্যাশিত আকার থাকতে পারে। যদি tput rowsআইওসিটিএল ব্যবহার না করতে পারে (উদাহরণস্বরূপ, আপনি যদি সিরিয়াল পোর্টের সাথে সংযুক্ত থাকেন) তবে এটি এখানে রেকর্ড করা মানগুলিতে ফিরে আসবে। এমন টার্মিনালের জন্য যার আকার পরিবর্তন হতে পারে, এটি কেবল অনুমান এবং ভুল হওয়ার সম্ভাবনা রয়েছে।আরও তথ্যের 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