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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 6

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

ΠžΠΏΡ†ΠΈΠΈ Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ².

β–  ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ состоят ΠΈΠ· дСфиса ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ символа (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π±ΡƒΠΊΠ²Π° Π² Π½ΠΈΠΆΠ½Π΅ΠΌ ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС). Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ быстрСС ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ.

β–  Π”Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ состоят ΠΈΠ· Π΄Π²ΡƒΡ… дСфисов, послС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт имя. содСрТащСС Π±ΡƒΠΊΠ²Ρ‹ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистров ΠΈ дСфисы. Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ Π»Π΅Π³Ρ‡Π΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… сцСнариях).

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Π΅ разновидности ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ: ΠΏΠ΅Ρ€Π²ΡƒΡŽ β€” для краткости, Π²Ρ‚ΠΎΡ€ΡƒΡŽ β€” для ясности. НапримСр, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ -h ΠΈ --help ΠΈ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠΏΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ сразу послС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ПослС ΠΎΠΏΡ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ΄Ρ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π² частности ΠΈΠΌΠ΅Π½Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

НСкоторыС ΠΎΠΏΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ собствСнных Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊ, рассмотрСнная Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ls -s / Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ содСрТимоС ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠžΠΏΡ†ΠΈΡ -s сообщаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ls ΠΎ нСобходимости отобраТСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (Π² ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Π°Ρ…) ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. АргумСнт / Π·Π°Π΄Π°Π΅Ρ‚ имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠžΠΏΡ†ΠΈΡ --size являСтся синонимом ΠΎΠΏΡ†ΠΈΠΈ -s, поэтому Ρ‚Π° ΠΆΠ΅ самая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π° Ρ‚Π°ΠΊ: ls -- size /.

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ GNU Coding Standards пСрСчислСны ΠΈΠΌΠ΅Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. ΠŸΡ€ΠΈ написании GNU-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ рСкомСндуСтся ΡΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ с этим Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ упомянутому Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Linux-систСм позволяСт ΠΊΠΎΠΌΠ°Π½Π΄Π°

% info "(standards)User Interfaces"

2.1.3. Ѐункция getopt_long()

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки β€” ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π°. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ. Π² GNU-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка Π‘ Π΅ΡΡ‚ΡŒ функция getopt_long(), ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π°Ρ Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π­Ρ‚Π° функция ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅, Ρ‚Π°ΠΊ ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ. Π•Π΅ объявлСниС находится Π² Ρ„Π°ΠΉΠ»Π΅ <getopt.h>.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, трСбуСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΎΠΏΡ†ΠΈΠΈ (Ρ‚Π°Π±Π». 2.1).


Π’Π°Π±Π»ΠΈΡ†Π° 2.1. ΠžΠΏΡ†ΠΈΠΈ тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ° Длинная Ρ„ΠΎΡ€ΠΌΠ° НазначСниС -h --help ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ справки ΠΏΠΎ использованию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ -o имя_Ρ„Π°ΠΉΠ»Π° --output имя_Ρ„Π°ΠΉΠ»Π° Π—Π°Π΄Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° -v --verbose ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… сообщСний

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt_long() Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π²Π΅ структуры. ΠŸΠ΅Ρ€Π²Π°Ρ β€” это строка с описаниСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ (каТдая ΠΈΠ· Π½ΠΈΡ… прСдставлСна ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ). Если опция ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, послС Π½Π΅Π΅ ставится Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅. Π’ нашСм случаС строка Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ ho:v. Π­Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ -h, -ΠΎ ΠΈ -v, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ для Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… трСбуСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

Бписок Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ задаСтся Π² Π²ΠΈΠ΄Π΅ массива структур option. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ ΠΈ состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ. Π§Π°Ρ‰Π΅ всСго ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ содСрТит имя ΠΎΠΏΡ†ΠΈΠΈ (строка символов Π±Π΅Π· Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… дСфисов), Π²Ρ‚ΠΎΡ€ΠΎΠ΅  β€” 1, Ссли опция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΈ 0 β€” Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС: Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ β€” NULL; Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ΅ β€” символьная константа, Π·Π°Π΄Π°ΡŽΡ‰Π°Ρ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ эквивалСнт Π΄Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ. ПослСдний элСмСнт массива Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ Π½ΡƒΠ»ΠΈ. Наш массив Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

const struct option long_options[] = {

 { "help",    0, NULL, 'h' },

 { "output",  1, NULL, 'o' },

 { "verbose", 0, NULL, 'v' },

 { NULL,      0, NULL, 0 }

};

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt_long() ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ argc ΠΈ argv Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(). НиТС пСрСчислСны особСнности Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

β–  ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ функция getopt_long() Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ, возвращая Π±ΡƒΠΊΠ²Ρƒ, которая соотвСтствуСт ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΌΡƒ эквивалСнту ΠΎΠΏΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ отсутствии ΠΎΠΏΡ†ΠΈΠΉ возвращаСтся -1.

β–  ΠžΠ±Ρ‹Ρ‡Π½ΠΎ функция getopt_long() вызываСтся Π² Ρ†ΠΈΠΊΠ»Π΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСх ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π’Ρ‹Π±ΠΎΡ€ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ осущСствляСтся посрСдством конструкции switch.

β–  Π•сли опция getopt_long() ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ (Ρ‚.Π΅. ΠΎΠ½Π° Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π° Π² спискС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ), ΠΎΠ½Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ символ ? (Π·Π½Π°ΠΊ вопроса). Π’ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° это Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ отобраТая справку ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ.

β–  ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΎΠΏΡ†ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ optarg помСщаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку с содСрТимым Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

β–  ΠšΠΎΠ³Π΄Π° функция getopt_long() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ· ΠΎΠΏΡ†ΠΈΠΉ, Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ optind записываСтся индСкс Ρ‚ΠΎΠ³ΠΎ элСмСнта массива argv, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ.

Π’ листингС 2.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt_long().

Листинг 2.2. (getopt_long.c) ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getopt_long()

#include <getopt.h>

#include <stdio.h>

#include <stdlib.h>


/* Имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. */

const char* program_name;


/* Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± использовании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΠΎΡ‚ΠΎΠΊ STREAM

   (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ stdout ΠΈΠ»ΠΈ stderr) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΠ΄Π°

   EXIT_CODE. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main() Π½Π΅ происходит */

void print_usage(FILE* stream, int exit_code) {

 fprintf(stream, "Usage: %s options [ inputfile ... ]\n",

  program_name);

 fprintf(stream,

  " -h --help    Display this usage

                 information.\n"

  " -ΠΎ --output  filename Write output to file.\n"

  " -v --verbose Print verbose messages.\n");

 exit(exit_code);

}


/* Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ARGC содСрТит Ρ€Π°Π·ΠΌΠ΅Ρ€

   списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²; ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ARGV -- это массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

   Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. */

int main(int argc, char* argv[]) (

 int next_option;


 /* Π‘Ρ‚Ρ€ΠΎΠΊΠ° с описаниСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ. */

 const char* const short_options = "ho:v";

 /* Массив с описаниСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ. */

 const struct option long_options[] = {

  { "help",    0, NULL, 'h' },

  { "output",  1, NULL, 'o' },

  { "verbose", 0, NULL, 'v' },

  { NULL,      0, NULL, 0 } /* ВрСбуСтся Π² ΠΊΠΎΠ½Ρ†Π΅ массива. */

 };


 /* Имя Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹

    ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ»ΠΈ NULL, Ссли Π²Ρ‹Π²ΠΎΠ΄ направляСтся Π² ΠΏΠΎΡ‚ΠΎΠΊ

    stdout. */

 const char* output_filename = NULL;

 /* Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π»ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Π΅ сообщСния. */

 int verbose = 0;


 /* Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ

    Π² сообщСния. Оно хранится Π² элСмСнтС argv[0] */

 program_name = argv[0];


 do {

  next_option =

   getopt_long(argc, argv, short_options,

    long_options, NULL);

  switch(next_opt ion) {

  case "h": /* -h ΠΈΠ»ΠΈ --help */

   /* ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ запросил ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании

      ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΡƒΠΆΠ½ΠΎ вывСсти Π΅Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ stdout ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ

      Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΠ΄Π° 0 (Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅). */

   print_usage(stdout, 0);

  case 'o': /* -ΠΎ ΠΈΠ»ΠΈ --output */

   /* Π­Ρ‚Π° опция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ -- имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. */

      output_filename = optarg;

   break;

  case 'v': /* -v ΠΈΠ»ΠΈ --verbose */

   verbose = 1;

   break;

  case '?': /* ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π» Π½Π΅Π²Π΅Ρ€Π½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ. */

   /* ЗаписываСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΠΎΡ‚ΠΎΠΊ

      stderr ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΠ΄Π° 1

      (Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅). */

   print_usage(stderr, 1);

  case -1: /* ΠžΠΏΡ†ΠΈΠΉ большС Π½Π΅Ρ‚. */

   break;

  default: /* Какой-Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. */

   abort();

  }

 }

 while (next_option != -1);


 /* ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠΏΡ†ΠΈΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, пСрСмСнная OPTIND ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°

    ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ. Π’ дСмонстрационных

    цСлях ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Ссли Π·Π°Π΄Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ VERBOSE. */

 if (verbose) {

  int i;

  for (i = optind; i < argc; ++i)

   printf("Argument: %s\n", argv[i]);

 }


 /* Π”Π°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ‚ основноС Ρ‚Π΅Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹... */


 return 0;

}