pooia
pooia
خواندن ۳ دقیقه·۳ سال پیش

ادیتور/ویرایشگر تحت کنسول خود را با C بسازید. (8)

قسمت قبل


توی قسمت قبل، یک سیستم ساختیم که کلید فشار داده شده را نشان می‌داد، داشتیم می‌گتفیم Ctrl+A یک برمی‌گرداند، Ctrl+B دو برمی‌گرداند، ولی Ctrl+C چطور؟ نه برنامه را خاتمه می‌داد. البته ما تنها با Ctrl+C مشکل نداشتیم، با کلیدهایی مثل Ctrl+S هم مشکل داشتیم!

توی این قسمت یکی به یکی این مشکلات را حل می‌کنیم.

کلیدهای Ctrl+C و Ctrl+Z

به صورت معمول، Ctrl+C یک سیگنال SIGINT ارسال می‌کنند که باعث خاتمه یافتن برنامه‌می شود و همچنین Ctrl+Z باعث می‌شود تا یک سیگنال SIGTSTP به برنامه ارسال بشود که برنامه را معلق می‌کند.

یعنی:

Ctrl+C -- Terminate

Ctrl+Z -- Suspend

حالا چطوری این دو را غیرفعال کنیم؟

raw.c_lflag&= ~(ECHO|ICANON|ISIG);

می‌بینید که تنها فرق موجود اضافه کردنِ فلگ ISIG هست که از <termios.h> می‌آید.

خوب، حالا Ctrl+C و Ctrl+Z را امتحان کنید. ببینید، برنامه خاتمه نیافت!

این، همچنین باعث می‌شود تا Ctrl+Y در مک‌او‌اس هم از کار بیافتد. Ctrl+Y در مک شبیه Ctrl+Z هست فقط با این تفاوت که صبر می‌کند تا برنامه ورودی را بخواند و بعد برنامه را suspend می‌کند.


خاموش کردن Ctrl+S و Ctrl+Q


داشتید می‌گفتید، Ctrl+A=1 و Ctrl+B=2 و Ctrl+C=3 و Ctrl+D=4 و ... اما یهو Ctrl+S اه هیچی تایپ نمی‌شود، چرا بعد از Ctrl+S هیچی تایپ نشد؟ بگذار بنویسم q تا از برنامه خارج بشوم. وای باز هم کار نکرد...


+ استاپ

+ برادر Ctrl+Q را بگیر

- ممنون

+ خواهش می‌کنم.

ماجرا این هست که وقتی شما کلید ترکیبی Ctrl+S را می‌گیرید ترمینال وارد حالت freeze می‌شود و هیچ اتفاقی نمی‌افتد.

هر چقدر تایپ کنید هیچ به هیچ، هیچ اتفاقی نمی‌افتد! اما اگر Ctrl+Q را بگیرید. تمام دکمه‌هایی که زده بودید اما کار نکردند دانه دانه نمایان می‌شود. بنابراین:

وقتی که Ctrl+S رو فشار بدهید باعث می‌شود تا کلیدهایی که فشرده می‌شوند ضبط شوند و هنگامی که Ctrl+Q را فشار می‌دهید باعث اجرا شدن تمامی کلیدهای ضبط شده می‌شود.

این قابیلت معمولا برای software flow control استفاده می‌شود.

برای از بین بردن این قابلیت کافی هست تا قطعه کد زیر را به سورس کد اضافه (append) کنیم.

raw.c_iflag &= ~(IXON);
اگر کد را کوچک می‌بینید یا اصلا نمی‌بینید، بدانید و آگاه باشید که مقصر ویرگول هست وگرنه من تصویر را با سایز مناسب از صفحه نمایش گرفتم ویرگول کوچک نشان می‌دهید. برای حل این مشکل: ۱. تصویر را دنلود کنید. ۲. با یک نرم‌افزار که قابلیت زوم دارد تصویر را باز کنید. (!) واقعا جز این چی انتظار داشتی؟ بیکار بودی این همه زیر نویش را خواندی؟
اگر کد را کوچک می‌بینید یا اصلا نمی‌بینید، بدانید و آگاه باشید که مقصر ویرگول هست وگرنه من تصویر را با سایز مناسب از صفحه نمایش گرفتم ویرگول کوچک نشان می‌دهید. برای حل این مشکل: ۱. تصویر را دنلود کنید. ۲. با یک نرم‌افزار که قابلیت زوم دارد تصویر را باز کنید. (!) واقعا جز این چی انتظار داشتی؟ بیکار بودی این همه زیر نویش را خواندی؟

شما می‌دانید چرا constantهای ECHO | ICANON | ISIG در c_lflag هستند اما IXON در c_iflag هست؟

چون که c_lflag برای Local FLAGs هست و c_iflag برای Input FLAGs هست!

بله، برعکس همه فلگ‌های تا اینجا با دیدم که با I شروع می‌شدند (که local flag بودند) این فلگ input flag هست!

مثل بقیه فلگ‌های موجود IXON از termios.h می‌آید

and XON comes from the names of the two control characters that Ctrl-S and Ctrl-Q produce: XOFF to pause transmission and XON to resume transmission.

اسم XO*[*] اسم کاراکترهای‌کنترلی Ctrl-S و Ctrl-Q هست!


در این مثالی که در بالا زدم (می‌دانم چرا اینطوری نوشته می‌شود اما نمی‌توان خط را عوض کنم، به هر حال قشنگ هست :) XOFF برای stop کردن ترمینال یا معادل Ctrl+S به کار می‌رود و Ctrl+Q سیگنال XON که باعث ادامه دادن فعالیت ترمینال می‌شود.


خوب امیدوارم تا الان بی مشکل این متن را خوانده باشید، باید عرض کنم که هنوز هم تعدادی کلید دیگر باقی مانده که حوصله‌ام سر رفت و عرض نمی‌کنم.


شما اگر عمر این پیشنویس را بدانید، یک ضربه در سر [مبارک] من می‌زدید که بچه چه کارت بوده در دو هفته نتونستی یک پیشنویس ۴ دقیقه‌ای بنویسی؟


خداحافظ

خدا یار و نگه‌دارت

ادیتورویرایشگرeditorبرنامه نویسی
درحال برنامه نویسی
شاید از این پست‌ها خوشتان بیاید