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

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

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

Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ называСтся каноничСским ΠΈΠ»ΠΈ стандартным Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ. Π’Π΅ΡΡŒ Π²Π²ΠΎΠ΄ обрабатываСтся ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ строк. Пока строка Π²Π²ΠΎΠ΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ наТатия клавиши <Enter>), интСрфСйс Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° управляСт всСми Π½Π°ΠΆΠ°Ρ‚Ρ‹ΠΌΠΈ клавишами, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ <Backspace>, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа.

ΠŸΡ€ΡΠΌΠ°Ρ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ β€” нСканоничСский Ρ€Π΅ΠΆΠΈΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ большС возмоТностСй контроля Π½Π°Π΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… символов. ΠœΡ‹ Π΅Ρ‰Π΅ вСрнСмся ΠΊ этим Π΄Π²ΡƒΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅.

Помимо всСго ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π² ОБ Linux ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ символы ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² сигналы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Ctrl>+<C>), ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… клавиш <Backspace> ΠΈ <Delete> ΠΈ Π²Π°ΠΌ Π½Π΅ придСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ написанной Π²Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. О сигналах Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ большС Π² Π³Π»Π°Π²Π΅ 11.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ происходит Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅? ОБ Linux сохраняСт Π²Π²ΠΎΠ΄ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter>, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ символ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню ΠΈ слСдом Π·Π° Π½ΠΈΠΌ ΠΊΠΎΠ΄ клавиши <Enter>. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ символ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

getchar
, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ символ ΠΈ снова Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚
getchar
, Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ символ клавиши <Enter>.

Π‘ΠΈΠΌΠ²ΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ Π²ΠΈΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, β€” это Π½Π΅ символ ASCII Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ CR (дСсятичный ΠΊΠΎΠ΄ 13, ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ 0D), Π° символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки LF (дСсятичный ΠΊΠΎΠ΄ 10, ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ 0A). Π’Π°ΠΊ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ОБ Linux (ΠΊΠ°ΠΊ ΠΈ UNIX) всСгда примСняСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ тСкстовых строк, Ρ‚. Π΅. Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ОБ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ MS-DOS, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ символов Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, ОБ UNIX примСняСт, для обозначСния Π½ΠΎΠ²ΠΎΠΉ строки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки. Если Π²Π²ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π½ΠΎΠ΅ устройство посылаСт ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈ символ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ, Π² ОБ Linux ΠΎΠ± этом заботится ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Если Π²Ρ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² MS-DOS ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах, это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· сущСствСнных прСимущСств Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² отсутствии Π² ОБ Linux Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ тСкстовыми ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΈΡ… Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Ρ‹ ΠΈ ΠΏΠ»ΠΎΡ‚Ρ‚Π΅Ρ€Ρ‹.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ основной нСдостаток вашСй ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ мСню, просто игнорируя Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅:

do {

Β selected = getchar();

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

Он Ρ€Π΅ΡˆΠ°Π΅Ρ‚ нСпосрСдствСнно Π²ΠΎΠ·Π½ΠΈΠΊΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΈ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅:

$ <b>./menu1</b>

Choice: Please select an action

a β€” add new record

d β€” delete record

q β€” quit

<b>a</b>

You have chosen: a

Choice: Please select an action

a β€” add new record

d β€” delete record

q β€” quit

<b>q</b>

You have chosen: q $

ΠœΡ‹ вСрнСмся ΠΏΠΎΠ·ΠΆΠ΅ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, связанной с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter>, ΠΈ Π±ΠΎΠ»Π΅Π΅ элСгантному Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°

Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π² ОБ Linux, Π΄Π°ΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ…, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ своСго Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΊ Π² Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π΅Π΅ Π²Ρ‹Π²ΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ».

$ <b>./menu1 &gt; file</b>

<b>a</b>

<b>q</b>

$

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

О ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ стандартного Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ дСскриптора Ρ„Π°ΠΉΠ»Π°, ассоциированного с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ. Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ выполняСт систСмный Π²Ρ‹Π·ΠΎΠ²

isatty
. Π’Ρ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π΅ΠΌΡƒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°, ΠΈ ΠΎΠ½ провСряСт, связан Π»ΠΈ этот дСскриптор Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ.

<b>#include &lt;unistd.h&gt;</b>

<b>int isatty(int fd);</b>

БистСмный Π²Ρ‹Π·ΠΎΠ²

isatty
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1, Ссли ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°
fd
связан с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ, ΠΈ 0 Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π½ΠΎ

isatty
ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дСскрипторами Ρ„Π°ΠΉΠ»ΠΎΠ². Для выполнСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ прСобразования Π²Π°ΠΌ придСтся ΡΠΎΡ‡Π΅Ρ‚Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²
isatty
с ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ
fileno
, ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅ΠΉΡΡ Π² Π³Π»Π°Π²Π΅ 3.

Π§Ρ‚ΠΎ Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли стандартный Π²Ρ‹Π²ΠΎΠ΄

stdout
ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½? ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ β€” Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅Ρ‚ возмоТности Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π’Ρ‹Π²ΠΎΠ΄ сообщСния Π²
stdout
Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. ЕдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сообщСниС Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ ошибок
stderr
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ пСрСнаправляСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ
&gt; file
(ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.2).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° для выявлСния пСрСнаправлСния Π²Ρ‹Π²ΠΎΠ΄Π°

ВнСситС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ menu1.с ΠΈΠ· упраТнСния 5.1. НазовитС Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» menu2.c.

#include &lt;unistd.h&gt;

...

int main() {

Β int choice = 0;

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

Β  fprintf(stderr, &quot;You are not a terminal!\n&quot;);

Β Β exit(1);

Β }

Β do {

Β  choice = getchoice(&quot;Please select an action&quot;, menu);

Β Β printf(&quot;You have chosen: %c\n&quot;, choice);

Β } while (choice != 'q');

Β exit(0);

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотритС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°: