توی قسمت قبل، یک سیستم ساختیم که کلید فشار داده شده را نشان میداد، داشتیم میگتفیم Ctrl+A یک برمیگرداند، Ctrl+B دو برمیگرداند، ولی Ctrl+C چطور؟ نه برنامه را خاتمه میداد. البته ما تنها با Ctrl+C مشکل نداشتیم، با کلیدهایی مثل Ctrl+S هم مشکل داشتیم!
توی این قسمت یکی به یکی این مشکلات را حل میکنیم.
به صورت معمول، 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+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 که باعث ادامه دادن فعالیت ترمینال میشود.
خوب امیدوارم تا الان بی مشکل این متن را خوانده باشید، باید عرض کنم که هنوز هم تعدادی کلید دیگر باقی مانده که حوصلهام سر رفت و عرض نمیکنم.
شما اگر عمر این پیشنویس را بدانید، یک ضربه در سر [مبارک] من میزدید که بچه چه کارت بوده در دو هفته نتونستی یک پیشنویس ۴ دقیقهای بنویسی؟
خداحافظ
خدا یار و نگهدارت