Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 58

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

int main() {

 int choice = 0;

 FILE *input;

 FILE *output;

 struct termios initial_settengs, new_settings;

3. ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getchoice Π²Π°ΠΌ слСдуСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ характСристики Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, этим опрСдСляСтся мСсто ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строк:

 if (!isatty(fileno(stdout))) {

  fprintf(stderr, "You are not a terminal, OK.\n");

 }

 input = fopen("/dev/tty", "r");

 output = fopen("/dev/tty", "w");

 if (!input || !output) {

  fprintf(stderr, "Unable to open /dev/tty\n");

  exit(1);

 }

 tcgetattr(fileno(input), &initial_settings);

 new_settings = initial_settings;

 new_settings.c_lfag &= ~ICANON;

 new_settings.c_lflag &= ~ECHO;

 new_settings.c_cc[VMIN] = 1;

 new_settings.c_cc[VTIME] = 0;

 new_settings.c_lflag &= ~ISIG;

 if (tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {

  fprintf(stderr, "could not set attributes\n");

 }

4. ΠŸΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния:

 do {

  choice = getchoice("Please select an action", menu, input, output);

  printf("You have chosen: %c\n", choice);

 } while (choice != 'q');

 tcsetattr(fileno(input), TCSANOW, &initial_settings);

 exit(0);

}

5. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π² нСканоничСском Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° соотвСтствиС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρ‹ ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стандартноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ CR (Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ) Π² LF (ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку) большС Π½Π΅ выполняСтся:

int getchoice (char *greet, char *choices[], FILE *in, FILE *out) {

 int chosen = 0;

 int selected;

 char **option;

 do {

  fprintf(out, "Choice: %s\n", greet);

  option = choices;

  while (*option) {

   fprintf(but, "%s\n", *option);

   option++;

  }

  do {

   selected = fgetc(in);

  } while (selected == '\n' || selected == '\r');

  option = choices;

  while (*option) {

   if (selected == *option[0]) {

    chosen = 1;

    break;

   }

   option++;

  }

  if (!chosen) {

   fprintf(out, "Incorrect choice, select again\n");

  }

 } while(!chosen);

 return selected;

}

Пока Π²Ρ‹ Π½Π΅ устроитС всС ΠΈΠ½Π°Ρ‡Π΅, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΌΠ΅Ρ‚ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl>+<C>, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ этих ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов, очистив Ρ„Π»Π°Π³ ISIG Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…. Для этого Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка:

new_settings.c_lflag &= ~ISIG;

Если Π²Ρ‹ внСсСтС эти измСнСния Π² Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ мСню, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ»ΠΈΠΊ, ΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π²Π°ΠΌΠΈ символ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° экранС.

$ ./menu4

Choice: Please select an action

a β€” add new record

d β€” delete record

q β€” quit

You have chosen: a

Choice: Please select an action

a β€” add new record

d β€” delete record

q β€” quit

You have chosen: q $

Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl>+<C>, символ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ прямо Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ истолкован, ΠΊΠ°ΠΊ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€.

Π’Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры Ρ‚ΠΈΠΏΠ° termios Π²Ρ‹ управляли Π²Π²ΠΎΠ΄ΠΎΠΌ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ управлСния Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΌΠΈ Π½Π° экранС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Π’ Π½Π°Ρ‡Π°Π»Π΅ Π³Π»Π°Π²Ρ‹ Π²Ρ‹ примСняли Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ printf для Π²Ρ‹Π²ΠΎΠ΄Π° символов Π½Π° экран, Π½Π΅ имСя ΠΏΡ€ΠΈ этом возмоТности ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ мСсто экрана.

Π’ΠΈΠΏ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах UNIX ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сСгодня Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях "Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»" ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅ Π±Ρ‹Ρ‚ΡŒ ПК, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ эмуляции Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈΠ»ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ срСдС, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ xterm Π² графичСской ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ X11.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ сущСствовало ΠΎΡ‡Π΅Π½ΡŒ большоС число Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всС ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (строки символов, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с escape-символа) для управлСния ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ курсора ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΆΠΈΡ€Π½ΠΎΠ΅ Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ€Ρ†Π°Π½ΠΈΠ΅, способы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ управлСния ΠΏΡ€ΠΈ этом слабо стандартизованы. Π£ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… старых ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π½Ρ‹Π΅ характСристики ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ экрана, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° посылаСтся символ Backspace, ΠΈ Ρ‚.Π΄.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

БущСствуСт стандарт ANSI для Π½Π°Π±ΠΎΡ€Π° escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ (Π² основном Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΡ…, примСняСмых Π² сСрии VT-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Digital Equipment Corporation, Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠΌ). МногиС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΡΠΌΡƒΠ»ΡΡ†ΠΈΡŽ стандартного Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, часто VT100, VT220 ΠΈΠ»ΠΈ ANSI, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ².

Π’Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для программистов, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ управлСния экраном, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². НапримСр, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ANSI примСняСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов Escape, [, A для пСрСмСщСния курсора Π²Π²Π΅Ρ€Ρ… Π½Π° ΠΎΠ΄Π½Ρƒ строку. Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π» ADM-Π—Π° (ΠΎΡ‡Π΅Π½ΡŒ распространСнный нСсколько Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ символ ΠΎΡ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl>+<K>.

НаписаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Π΄Π΅Π»ΠΎ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°ΠΌΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² систСмС UNIX, каТСтся ΠΊΡ€Π°ΠΉΠ½Π΅ ΡƒΡΡ‚Ρ€Π°ΡˆΠ°ΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ понадобится Ρ€Π°Π·Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Как Π½ΠΈ странно, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сущСствуСт Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅, извСстном ΠΊΠ°ΠΊ terminfo. ВмСсто нСобходимости обслуТивания любого Ρ‚ΠΈΠΏΠ° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π΅ΠΉ достаточно ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² для получСния ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ соврСмСнных систСм UNIX, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Linux, эта Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… объСдинСна с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΌ curses, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅.

Для примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ terminfo Π²Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» curses.h ΠΏΠ°ΠΊΠ΅Ρ‚Π° curses ΠΈ собствСнный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» term.h ΠΏΠ°ΠΊΠ΅Ρ‚Π° terminfo. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах Linux Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, придСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ curses, ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ ΠΊΠ°ΠΊ ncurses, ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» ncurses.h для прСдоставлСния ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ² вашим функциям terminfo.

УстановитС Ρ‚ΠΈΠΏ вашСго Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ОБ Linux содСрТит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ TERM, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚ΠΈΠΏ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° устанавливаСтся систСмой автоматичСски Π²ΠΎ врСмя рСгистрации Π² систСмС. БистСмный администратор ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ нСпосрСдствСнно ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ подсказку с Ρ‚ΠΈΠΏΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… сСтСвых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TERM ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ rlogin Ρ‡Π΅Ρ€Π΅Π· telnet.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΠΎ сообраТСниях систСмы ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌ ΠΈΠ»ΠΈ Сю Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

$ echo $TERM

xterm

$

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° выполняСтся ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ xterm β€” эмулятора Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° для графичСской ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ X Window System, ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ "Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности, ΠΊΠ°ΠΊ KDE's Konsole ΠΈΠ»ΠΈ GNOME's gnome-terminal.

ΠŸΠ°ΠΊΠ΅Ρ‚ terminfo содСрТит Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… характСристик ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ для большого числа Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² ΠΈ прСдоставляСт Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс для ΠΈΡ… использования. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, смоТСт ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π²Ρ‹Π³ΠΎΠ΄Ρƒ ΠΎΡ‚ примСнСния Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ мноТСства Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ².

Π₯арактСристики Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² Π² terminfo ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Они хранятся Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² terminfo, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ находятся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… /usr/lib/terminfo ΠΈΠ»ΠΈ /usr/share/terminfo. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° (ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Π² terminfo) Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ характСристики Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ способ доступа ΠΊ Π΅Π³ΠΎ функциям. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слишком большого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ хранятся Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ Ρ‚ΠΈΠΏΠ° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Π’Π°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° VT100 ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ …terminfo/v/vt100.

Π€Π°ΠΉΠ»Ρ‹ terminfo ΠΏΠΈΡˆΡƒΡ‚ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π² исходном Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΌ (ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΌ!) для чтСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ компилируСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ tic Π² Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈ эффСктивный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ. Π‘Ρ‚Ρ€Π°Π½Π½ΠΎ, стандарт X/Open ссылаСтся Π½Π° описания исходного ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Π½ΠΎ Π½Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ tic, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ прСобразования исходного Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ. Для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΉ для чтСния вСрсии ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта Π½Π°Π±ΠΎΡ€Π° terminfo ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ infocmp.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° terminfo для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° VT100:

$ infocmp vt100

vt100|vt100-am|dec vt100 (w/advanced video),