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

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

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

Π’Π°Π±Π»ΠΈΡ†Π° 4.13

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ resource ОписаниС RLIMIT_CORE ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° Π΄Π°ΠΌΠΏΠ° ядра, Π² Π±Π°ΠΉΡ‚Π°Ρ… RLIMIT_CPU ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ЦП, Π² сСкундах RLIMIT_DATA ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сСгмСнта data(), Π² Π±Π°ΠΉΡ‚Π°Ρ… RLIMIT_FSIZE ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°, Π² Π±Π°ΠΉΡ‚Π°Ρ… RLIMIT_NOFILE ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² RLIMIT_STACK ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° стСка, Π² Π±Π°ΠΉΡ‚Π°Ρ… RLIMIT_AS ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступного адрСсного пространства (стСк ΠΈ Π΄Π°Π½Π½Ρ‹Π΅), Π² Π±Π°ΠΉΡ‚Π°Ρ…

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 4.15 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° limits.c, ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Она Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π΅Ρ‚ ΠΈ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ограничСния рСсурсов.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.16. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ рСсурсов

1. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅:

#include <sys/types.h> \

#include <sys/resource.h>

#include <sys/time.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

2. Π€ΡƒΠ½ΠΊΡ†ΠΈΡ Ρ‚ΠΈΠΏΠ° void записываСт 10 000 Ρ€Π°Π· строку Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ Π·Π°Ρ‚Π΅ΠΌ выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ арифмСтичСскиС вычислСния для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ЦП:

void work() {

 FILE *f;

 int i;

 double x = 4.5;

 f = tmpfile();

 for (i = 0; i < 10000; i++) {

  fprintf(f, "Do some output\n");

  if (ferror(f)) {

   fprintf(stderr, "Error writing to temporary file\n");

   exit(1);

  }

 }

 for (i = 0; i < 1000000; i++) x = log(x*x + 3.21);

}

3. Π€ΡƒΠ½ΠΊΡ†ΠΈΡ main Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ work, Π° Π·Π°Ρ‚Π΅ΠΌ примСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getrusage для опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ЦП, использованного work. Π­Ρ‚Π° информация выводится Π½Π° экран:

int main() {

 struct rusage r_usage;

 struct rlimit r_limit;

 int priority;

 work();

 getrusage(RUSAGE_SELF, &r_usage);

 printf("CPU usage: User = %ld.%06ld, System = %ld.%06ld\n",

  r_usage.ru_utime.tvsec, rusage.ru_utime.tv_usec,

  r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);

4. Π”Π°Π»Π΅Π΅ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getpriority ΠΈ getrlimit для выяснСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° соотвСтствСнно:

 priority = getpriority(PRIO_PROCESS, getpid());

 printf("Current priority = %d\n", priority);

 getrlimit(RLIMIT_FSIZE, &r_limit);

 printf("Current FSIZE limit: soft = %ld, hard = %ld\n",

  r_limi t.rlim_cur, r_limit.rlim_max);

5. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setrlimit ΠΈ снова Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ work, которая Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ с ошибкой, Ρ‚.ΠΊ. попытаСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ слишком большой Ρ„Π°ΠΉΠ»:

 r_limit.rlim_cur = 2048;

 r_limit.rlim_max = 4096;

 printf("Setting a 2K file size limit\n");

 setrlimit(RLIMIT_FS1ZE, &r_limit);

 work();

 exit(0);

}

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, сколько Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ЦП, ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ смоТСт Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±ΠΎΠ»Π΅Π΅ 2048 Π±Π°ΠΉΡ‚ΠΎΠ².

$ cc -о limits limits.с -lm

$ ./limits

CPU usage: User = 0.140008, System = 0.020001

Current priority = 0

Current FSIZE limit: soft = -1, hard = -1

Setting a 2K file size limit

File size limit exceeded

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, запустив Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nice. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ мСняСтся ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ +10, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ дольшС.

$ nice ./limits

CPU usage: User = 0.152009, System = 0.020001

Current priority = 10

Current FSIZE limit: soft = -1, hard = -1 

Setting a 2K file size limit

File size limit exceeded

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° limits Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ work для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Она выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вычислСния ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠΊΠΎΠ»ΠΎ 150 ΠšΠ±Π°ΠΉΡ‚ записываСтся Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния рСсурсами для выяснСния своСго ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ограничСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ Π·Π°Π΄Π°Π½Ρ‹, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» любого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (Ссли позволяСт дисковоС пространство). Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π΄Π°Π΅Ρ‚ своС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°, Ρ€Π°Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 2 ΠšΠ±Π°ΠΉΡ‚, ΠΈ снова пытаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСйствия. На этот Ρ€Π°Π· функция work Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ большой Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

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

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ulimit ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ bash.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сообщСниС ΠΎΠ± ошибкС "Error writing to temporary file" ("Ошибка записи Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»") Π½Π΅ выводится. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ систСмы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Linux 2.2 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠ΅ вСрсии) Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ ограничСния рСсурса. ДСлаСтся это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сигнала SIGXFSZ. Π’ Π³Π»Π°Π²Π΅ 11 Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ большС ΠΎ сигналах ΠΈ способах ΠΈΡ… примСнСния. Π”Ρ€ΡƒΠ³ΠΈΠ΅ систСмы, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ стандарту POSIX, Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΠ²ΡˆΡƒΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

РСзюмС 

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹ посмотрСли Π½Π° ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ систСмы Linux ΠΈ познакомились с условиями выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ± Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния β€” ΠΈ Ρ‚Π΅, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для измСнСния стандартного повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ подходящиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ.

Π’Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΌΠΈ функциями для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ свСдСния ΠΎ сСбС, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° выполняСтся.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ОБ Linux, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ дорогостоящиС рСсурсы, поэтому Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ способы опрСдСлСния ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ рСсурсов ΠΈ управлСния ΠΈΠΌΠΈ. 

Π“Π»Π°Π²Π° 5

Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, захочСтся внСсти Π² Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 2. Π•Π³ΠΎ, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚, самый ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ нСдостаток β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс; ΠΎΠ½ достаточно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½, Π½ΠΎ Π½Π΅ слишком элСгантСн. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ управляСмым Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚. Π΅. Π²Π²ΠΎΠ΄ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° экран. Помимо этого Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ написанным Π²Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ пСрСнаправлСния Π²Π²ΠΎΠ΄Π° ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ мСсто Π½Π° экранС.

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для управлСния Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ свСт Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π³Π»Π°Π²Ρ‹ 7, Π΅Π³ΠΎ основы Π²Ρ‹ Π·Π°Π»ΠΎΠΆΠΈΡ‚Π΅ Π² этой Π³Π»Π°Π²Π΅. Π“Π»Π°Π²Π° 6 посвящСна curses, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой вовсС Π½Π΅ Π΄Ρ€Π΅Π²Π½Π΅Π΅ проклятиС, Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ высокого уровня для управлСния ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° экранС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. ΠŸΠΎΠΏΡƒΡ‚Π½ΠΎ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Ρ‡ΡƒΡ‚ΡŒ большС ΠΎ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡΡ… ΠΏΡ€Π΅ΠΆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ„ΠΈ UNIX, познакомившись с основными ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ систСм Linux ΠΈ UNIX ΠΈ понятиСм Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. НизкоуровнСвый доступ, прСдставлСнный Π² этой Π³Π»Π°Π²Π΅, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, ΠΎ Ρ‡Π΅ΠΌ ΠΌΡ‹ пишСм здСсь, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΎΠΊΠ½Π΅ консоли, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ эмуляторы Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° KDE's Konsole, GNOME's gnome-terminal ΠΈΠ»ΠΈ стандартный X11 xterm.

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹, Π² частности, ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎ:

β–‘ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ записи Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»;

β–‘ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ ΠΎΠ±Ρ‰Π΅ΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ интСрфСйсС (General Terminal Interface, GTI);

β–‘ структурС Ρ‚ΠΈΠΏΠ° termios;

β–‘ Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… terminfo;

β–‘ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ наТатия клавиш.

Π§Ρ‚Π΅Π½ΠΈΠ΅ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ запись Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»

Π’ Π³Π»Π°Π²Π΅ 3 Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запускаСтся ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° обСспСчиваСт присоСдинСниС ΠΊ Π½Π΅ΠΉ стандартных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°. Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ простым ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ getchar ΠΈ printf для чтСния ΠΈΠ· стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈ записи Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°.

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 5.1 Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ menu1.c Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° языкС Π‘ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ формирования мСню, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.1. ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ формирования мСню Π½Π° языкС C

1. ΠΠ°Ρ‡Π½ΠΈΡ‚Π΅ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строк, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ мСню, ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ (описаниС) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getchoice:

#include <stdio.h>

#include <stdlib.h>


char *menu[] = {

 "a β€” add new record", "d β€” delete record", "q - quit", NULL,

};