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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 110

Автор Майкл ДТонсон

ioctl(fd, VT_DISALLOCATE, vtnum);

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ VC с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… простых ΠΊΠΎΠΌΠ°Π½Π΄ управлСния Π²Π²ΠΎΠ΄ΠΎΠΌ-Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ:

void disallow_vc_switch(int fd) {

 ioctl(fd, VT_LOCKSWITCH, 0);

}

void allow_vc_switch(int fd) {

 ioctl(fd, VT_UNLOCKSWITCH, 0);

}

20.6. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ open

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ: поиск Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ VC, запуск Π½Π° Π½Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ освобоТдСниС памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ VC, ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° open, входящая Π² состав дистрибутива Linux, выполняСт Ρ‚Π΅ ΠΆΠ΅ самыС дСйствия, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠ½Π° содСрТит большС ΠΎΠΏΡ†ΠΈΠΉ ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ошибок, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, являСтся Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ. Π₯отя привСдСнная Π½ΠΈΠΆΠ΅ вСрсия Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π΅Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ, Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΈΠ»ΠΈ бСзопасной.

 1: /* minopen.c */

 2:

 3: #include <stdio.h>

 4: #include <unistd.h>

 5: #include <stdlib.h>

 6: #include <signal.h>

 7: #include <fcntl.h>

 8: #include <sys/ioctl.h>

 9: #include <sys/vt.h>

10: #include <sys/stat.h>

11: #include <sys/types.h>

12: #include <sys/wait.h>

13:

14: int main (int argc, const char ** argv) {

15:  int vtnum;

16:  int vtfd;

17:  struct vt_stat vtstat;

18:  char device[32];

19:  int child;

20:

21:  vtfd = open("/dev/tty", O_RDWR, 0);

22:  if (vtfd < 0) {

23:   perror("minopen: Π½Π΅ удаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ /dev/tty");

24:   exit(1);

25:  }

26:  if (ioctl(vtfd, VT_GETSTATE, &vtstat) < 0) {

27:   perror("minopen: tty Π½Π΅ являСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ консолью");

28:   exit(1);

29:  }

30:  if (ioctl(vtfd, VT_OPENQRY, &vtnum) < 0) {

31:   perror("minopen: Π½Π΅Ρ‚ свободных Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… консолСй");

32:   exit(1);

33:  }

34:  sprintf(device, "/dev/tty%d", vtnum);

35:  if (access(device, (W_OK|R_OK)) < 0) {

36:   perror("minopen: нСдостаточныС полномочия Π½Π° tty");

37:   exit(1);

38:  }

39:  child = fork();

40:  if (child == 0) {

41:   ioctl(vtfd, VT_ACTIVATE, vtnum);

42:   ioctl(vtfd, VT_WAITACTIVE, vtnum);

43:   setsid();

44:   close(0); close(1); close(2);

45:   close(vtfd);

46:   vtfd = open(device, O_RDWR, 0); dup(vtfd); dup(vtfd);

47:   execlp("/bin/bash", "bash", NULL);

48:  }

49:  wait(&child);

50:  ioctl(vtfd, VT_ACTIVATE, vtstat.v_active);

51:  ioctl(vtfd, VT_WAITACTIVE, vtstat.v_active);

52:  ioctl(vtfd, VT_DISALLOCATE, vtnum);

53:  exit(0);

54: }

Π“Π»Π°Π²Π° 21

Консоль Linux

Консоль Linux, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Выводя ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ консоли, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ всСми аспСктами воспроизвСдСния Π½Π° экранС. Для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° экран ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ S-Lang, curses ΠΈΠ»ΠΈ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ рисования Π½Π° экранС; ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ упомянутыС ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Консоль ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ полноэкранный интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… спСциализированных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ для DOS, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ для Linux, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΡƒΠ³Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡ… Ρ„Π°ΠΊΡ‚. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π²Ρ‹Π²ΠΎΠ΄ символов Π½Π° экран β€” это Π½Π΅ просто инициализация указатСля Π½Π° адрСс экрана Π² памяти ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ запись прямо Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ. НСкоторыС Π΄Π°ΠΆΠ΅ ΠΆΠ°Π»ΡƒΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ»Π½Ρ‹ΠΉ голос Π½Π° эту "ΠΎΡ‚ΡΡ‚Π°Π»ΡƒΡŽ" систСму, которая Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡ… Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ выводят ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», вписывая ΠΌΠ΅ΠΆΠ΄Ρƒ символами ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ПослСдниС выводятся Π½Π° экран для управлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ курсора, Ρ†Π²Π΅Ρ‚ΠΎΠΌ, очисткой экрана ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

БущСствуСт нСсколько вСских ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ консоль ΠΊΠ°ΠΊ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». И Π½Π΅ послСдняя ΠΈΠ· Π½ΠΈΡ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, ΠΎΠ½Π° всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π•Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² сСтях (Π² нашС врСмя Internet), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΎΠΊΠ½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ эмулятора ΠΏΠΎΠ΄ X ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ графичСским интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ, Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ соСдинСниС) ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ выводят ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π° Π²Π°ΡˆΡƒ консоль.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌΠΈ интСрфСйсами для экрана. Они Ρ‚Π°ΠΊΠΆΠ΅ слуТат Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ основой для построСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π±ΠΎΠ»Π΅Π΅ высокого уровня Π²Ρ€ΠΎΠ΄Π΅ модуля curses, описанного Π² [36]. И это Π½Π΅ просто ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ; ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ вСсьма ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ, которая Π³ΠΎΠ΄Π°ΠΌΠΈ прСвосходно ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ фактичСским потрСбностям программистов. Консоль Linux основана Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярном сСмСйствС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ², наслСдников DEC VT100.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ символ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (escape) ANSI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΎΠ³ΠΎ прСдставлСния. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ termcap ΠΈ terminfo, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… для обозначСния символа ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ANSI примСняСтся ^[. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый символ, ΠΊΠ°ΠΊ Π½Π° \Π•. Π’ΡΡŽΠ΄Ρƒ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅, ΠΊΠ°ΠΊ ΠΈ Π² termcap ΠΈ terminfo, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ^C ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° символ Control-C.

21.1. Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… возмоТностСй

ДСйствия, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ, часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ возмоТностями (capabilities). НСкоторыС ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ большим числом Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ². МногиС ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² стандартС ANSI X3.64-1979. ΠŸΠΎΡ‡Ρ‚ΠΈ всС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ с возмоТностями ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ†Π²Π΅Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚ΠΎΠ² изобраТСния. ΠŸΡ€ΠΈ этом ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. НапримСр, Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Wyse 30 Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ <F1> ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ^ [email protected]\r, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π° консоли Linux β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ^[[[А. Аналогично, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ курсор Π²Π²Π΅Ρ€Ρ… Π½Π° Wyse 30, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ символ ^K, Π° Π½Π° консоли Linux β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ^[[А. Для создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° любом Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Π²Π°ΠΌ ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ абстрагирования ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ возмоТности, Π° Π½Π΅ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов.

НаиболСС извСстная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программирования, которая прСдоставляСт Ρ‚Π°ΠΊΡƒΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, называСтся curses[154] (прСдписания); ΠΎΠ½Π° описана Π² [36]. Π’ Π½Π΅Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… уровня. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ (говоря Π² ΠΎΠ±Ρ‰Π΅ΠΌ) ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для выполнСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ дСйствия, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²Π½ΠΈΠ·, ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° экрана ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ "ΠΎΠΊΠΎΠ½": нСзависимыС области ΠΎΠΊΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ этом curses обСспСчиваСт ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов для достиТСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ эффСкта.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° curses опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡΡΡŒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, которая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ставит Π² соотвСтствиС названия возмоТностСй строкам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°Ρ‚ΡŒΡΡ.

Linux, ΠΊΠ°ΠΊ всС соврСмСнныС систСмы Unix, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π²Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ Π² смыслС ΠΈΡ… возмоТностСй ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ. Π‘ΠΎΠ»Π΅Π΅ старая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… называСтся termcap (сокращСниС ΠΎΡ‚ terminal capabilities β€” Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности) ΠΈ хранится Π² ΠΎΠ΄Π½ΠΎΠΌ большом Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΌ ASCII-Ρ„Π°ΠΉΠ»Π΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ /etc/termcap. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» постСпСнно стал ΠΎΡ‡Π΅Π½ΡŒ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ; Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ вырос ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°. Π‘ΠΎΠ»Π΅Π΅ новая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… называСтся terminfo (сокращСниС ΠΎΡ‚ terminal information β€” Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ информация) ΠΈ хранится Π²ΠΎ мноТСствС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»), ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /usr/lib/terminfo.

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… информация ΠΎ возмоТностях для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° индСксируСтся ΠΎΠ΄Π½ΠΈΠΌ (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅) ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ОбС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ имя для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сСриала. НапримСр, консоль Linux называСтся linux ΠΈ Π² termcap, ΠΈ Π² terminfo. Π’Ρ‹ сообщаСтС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΡƒΡ‚Π΅ΠΌ установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния TERM. ΠŸΡ€ΠΈ создании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… termcap ΠΈ terminfo, Π²Π°ΠΌ Ρ€Π΅Π΄ΠΊΠΎ придСтся ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ TERM; ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π±Π΅Ρ€ΡƒΡ‚ Π½Π° сСбя Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для получСния доступа ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… termcap ΠΈΠ»ΠΈ terminfo.

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