كيف يمكنني التقاط واحدة ضغطات المفاتيح في unix وحدة التحكم التطبيق دون الحجب ؟

StackOverflow https://stackoverflow.com/questions/184108

  •  06-07-2019
  •  | 
  •  

سؤال

لدي بسيط جدا TCP خادم مكتوب في C.بل يمتد إلى أجل غير مسمى في انتظار اتصالات.على ويندوز, يمكنني استخدام select للتحقق من النشاط على مأخذ ، و إذا لم يكن هناك أي لدي البرمجية التالية إلى اسمحوا لي أن أستقيل من خلال ضرب 'س' على لوحة المفاتيح:

if( kbhit() ) {
   char c = getch();
   if( c == 'q' ) break;
}

هذا لا يعمل على يونكس ، منذ kbhit لا وجود لها ، getch يعمل بشكل مختلف.لقد وجدت بعض نموذج التعليمات البرمجية يستخدم tcsetattr لتغيير إعدادات المحطة والسماح الشخصية عن طريق إدخال حرف.بعد استدعاء الدالة init انا فتح /dev/ستدين (مع O_NONBLOCK) و قراءة حرف ، ولكن read( f, &c, 1 ) كتل حتى حرف ضرب.

أعتقد أنني يمكن أن تفرخ موضوع مستقل ويكون ذلك الانتظار إلى أجل غير مسمى ثم إشارة مؤشر ترابط الأول إذا كان المستخدم يضرب 'q', ولكن هذا يبدو قليلا الخرقاء.بالتأكيد هناك طريقة أسهل ؟

هل كانت مفيدة؟

المحلول

إضافة ستدين إلى قائمة مقابض مختارة، وإذا كان لديه البيانات، استدعاء قراءة لقراءة حرف واحد منه.

نصائح أخرى

وبدلا من ذلك، إضافة "و" من هاتفك

read( f, &c, 1 )

ولتحديد المكالمة. عندما و جاهزة للقراءة، تم الضغط على حرف، وقراءة () لن تمنع.

في يونكس ، سواء على نظام وحدة التحكم أو في X نافذة الطرفية, لوحة المفاتيح I/O يمر عبر محطة افتراضية.الجهاز /dev/tty هي الطريقة المعتادة في هذه الأيام من الوصول إلى العملية هو السيطرة على المحطة.الجهاز التلاعبات الأخرى من فتح/إغلاق/القراءة/الكتابة يتم التعامل معها من قبل ioctl(2) نظام الاتصال لهذا الجهاز معينة.فكرة عامة عن ما تريد القيام به هو

فتح السيطرة على محطة (التي قد تكون أو لا تكون stdin)

تغيير وضع التشغيل على محطة للعودة دون انتظار خط كامل من المدخلات (وهو الطبيعي الافتراضي)

وتواصل مع بقية البرنامج ، مع العلم أن يقرأ من محطة (التي قد تكون stdin) قد يعود جزئيا أو الخطوط أو حتى الصفر الشخصيات دون كونه خطأ أو إنهاء حالة.


إجابة مفصلة حول كيفية القيام الخطوة الثانية يتم العثور على في ج-البرمجة التعليمات.كما نشير إلى أن هذا هو OS السؤال ، وليس لغة السؤال.أنها توفر تسعة الاحتمالات ، ولكن ثلاثة منها رئيسية ذات الصلة على هذا السؤال هي

  1. استخدام الشتائم(3) مكتبة
  2. القديمة BSD أسلوب النظم استخدام sgttyb إلى مجموعة CBREAK أو الخام
  3. Posix أو النظام القديم V أسلوب النظم استخدام TCGETAW/TCSETAW إلى مجموعة c_cc[VMIN] 1 و c_cc[VTIME] إلى 0.

بعد عدة إشارات في ج التعليمات قد يؤدي إلى أن هذه الصفحة من kbhit أجزاء التعليمات البرمجية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top