كيفية طلب الإدخال دون الحاجة إلى الضغط على RET - مقاطعة لوحة المفاتيح في نظام التشغيل C وLinux

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

سؤال

لقد قرأت الكثير عما أطلبه، ولكن أقرب شيء وجدته هو استخدام مكتبة ncurses.ما أفعله هو عميل http بسيط سيقوم بمراقبة بعض المجلدات البعيدة للتحقق مما إذا كانت ملفاتها قد تغيرت أو ما إذا كانت هناك ملفات جديدة.أيضًا، يجب عليه التحقق من stdin لبعض الأوامر، لذلك، أخطط لاستخدام العملية الأب لمراقبة stdin والعملية المنفذة لمراقبة الدلائل البعيدة.أرغب في استخدام شيء مثل مقاطعة لوحة المفاتيح.شيء مثل تثبيت معالج الإشارة للضغط على لوحة المفاتيح، لذلك لا يضطر المستخدم إلى الضغط على زر الإدخال بعد كل أمر.

حتى الآن، تقوم ncurses بما أحتاج إليه، لكن لا يمكنني طباعة الأشياء على stdout، ولكن بدلاً من ذلك في stdscr.تكمن المشكلة في أن هذا المشروع عبارة عن مهمة جامعية، ومن المحتمل جدًا أن يتم التحقق منه من خلال برنامج نصي يقرأ stdout لبرنامج mi...

لذلك، أي اقتراحات؟

قطعة الكود ذات الصلة هي:

#include <ncurses.h>

  initscr();        /* Start curses mode              */
  raw();            /* Line buffering disabled        */
  noecho();         /* Don't echo() while we do getch */
  char key;
  while (TRUE) {
    key = getch();
    switch(key)
      {
      case 's':
        printw("Instrucción recibida: STOP\n");
        printf("Hasta Luego!\n");
        fflush(stdout);
        /*NOTICE THIS HAS NO EFFECT, */
        refresh();
        sleep(2);
        endwin();           /* End curses mode        */
        fflush(stdout);
        exit(0);
        break;
      case 'c':
        printw("Instrucción recibida: CONTINUE\n");
        refresh();
        break;
      case 'p':
        printw("Instrucción recibida: PAUSE\n");
        refresh();
        break;
      default:
        printw("Instrucción desconocida recibida: %c\n",key);
        refresh();
      }
  }
  endwin();           /* End curses mode        */

عندما أقوم بتشغيل برنامجي، إذا قمت بإعادة توجيه الإخراج إلى ملف، أحصل على ملف فارغ

$ verific -d http://url.toMy.directory/ > output
$ cat output
$

شكرا لمساعدتك!!!=)

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

المحلول

كان من الصعب العثور على هذا بشكل مدهش وما زلت غير راضٍ عن النتيجة:يمكنك استخدام stty() للذهاب إلى الوضع الخام.وهذا يتجنب (ن) اللعنات وأي تلاعب بها stdout.

من برنامج شل النصي، ستستخدم stty raw (شرح أطول).

تحتوي هذه الإجابة على رمز C: التقط الأحرف من الإدخال القياسي دون انتظار الضغط على زر الإدخال

لا تنس استعادة إعدادات جهاز TTY قبل الخروج وإلا فإن جهازك الطرفي سوف يتصرف بشكل غريب.أقترح تغليف التعليمات البرمجية الخاصة بك في برنامج نصي يحتوي على trap "stty sane" EXIT بالقرب من البداية.سيتم تنفيذ هذا دائمًا stty sane عندما ينتهي البرنامج النصي.

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