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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 16

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

Π’Π°Π±Π»ΠΈΡ†Π° 2.1. ЗначСния для

has_arg

ΠœΠ°ΠΊΡ€ΠΎΠΏΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ЧисловоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Бмысл
no_argument
0 ΠžΠΏΡ†ΠΈΡ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
required_argument
1 ΠžΠΏΡ†ΠΈΠΈ трСбуСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
optional_argument
2 АргумСнт ΠΎΠΏΡ†ΠΈΠΈ являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΊΠΎΠΉ элСмСнт с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ значСниями. Π’ послСднСм элСмСнтС массива всС значСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ. НСт нСобходимости ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив:

getopt_long()
осущСствляСт Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск. Однако, сортировка Π΅Π³ΠΎ ΠΏΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ для программиста.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ встрСчС использованиС

flag
ΠΈ
val
каТСтся ΡΠ±ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ с Ρ‚ΠΎΠ»ΠΊΡƒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Π½Π° врСмя шаг Π½Π°Π·Π°Π΄ ΠΈ рассмотрим, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠΏΡ†ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² установкС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… символов ΠΎΠΏΡ†ΠΈΠΉ, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ этого:

while ((с = getopt(argc, argv, ":af:hv")) != -1) {

 switch (с) {

Β case 'a':

Β  do_all = 1;

Β  break;

Β case 'f':

Β  myfile = optarg;

Β  break;

Β case 'h':

Β  do_help = 1;

Β  break;

Β case 'v':

Β  do_verbose = 1;

Β  break;

Β ... /* Π—Π΄Π΅ΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок */

Β }

}

Когда

flag
Π½Π΅ Ρ€Π°Π²Π΅Π½ NULL,
getopt_long()
устанавливаСт значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·Π° вас. Π­Ρ‚ΠΎ сниТаСт число ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
case
Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ
switch
с Ρ‚Ρ€Π΅Ρ… Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ ΠΈ ΠΊΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ:

int do_all, do_help, do_verbose; /* Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ */

char *my_file;

struct option longopts[] = {

Β { "all", no_argument, &do_all, 1 },

Β { "file", required_argument, NULL, 'f' },

Β { "help", no_argument, &do_help, 1 },

Β { "verbose", no_argument, &do_verbose, 1 },

Β { 0, 0, 0, 0 }

};

while ((с =

Β getopt_long(argc, argv, ":f:", longopts, NULL)) != -1) {

Β switch (c) {

Β case 'f':

Β  myfile = optarg;

Β  break;

Β case 0:

Β  /* getopt_long() устанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ,

Β Β  Β  просто ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ */

Β Β break;

Β ... /* Π—Π΄Π΅ΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок */

Β }

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ

optstring
, Π½Π΅ содСрТит большС '
a
', '
h
' ΠΈΠ»ΠΈ '
v
'. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ, Π²Π°ΠΌ придСтся Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²
switch
ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅
case
ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ свои ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Π±Ρ‹Π»Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ длинная опция. Π’ этом случаС ΠΏΡ€ΠΎΡ‰Π΅ всСго ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²

flag
NULL, Π° Π²
val
ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ символ.

2.3.3.2. Π”Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π² стилС POSIX

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠΏΡ†ΠΈΡŽ

-W
для спСцифичСских для производитСля возмоТностСй. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ
-W
нСпСрСносимо ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ систСмами.

Если Π·Π°

W
Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅
optstring
слСдуСт Ρ‚ΠΎΡ‡ΠΊΠ° с запятой (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π΅ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅),
getopt_long()
рассматриваСт
-Wlongopt
Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ
--longopt
. БоотвСтствСнно Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

while ((с =

Β getopt_long(argc, argv, ":f:W;", longopts, NULL)) != -1) {

Π‘ этим ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ

-Wall
являСтся Ρ‚Π΅ΠΌ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ
--all
, a
-Wfile=myfile
Ρ‚Π΅ΠΌ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ
--file=myfile
. ИспользованиС Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ
-W
Π² качСствС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ. (НапримСр, GCC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π΅ ΠΊΠ°ΠΊ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ
gawk
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π΅ для совмСстимости с POSIX.)

2.3.3 3. Π‘Π²ΠΎΠ΄ΠΊΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

getopt_long()

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ясно, Ρ‡Ρ‚ΠΎ

getopt_long()
прСдоставляСт Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΎΠΏΡ†ΠΈΠΉ. Π’ Ρ‚Π°Π±Π». 2.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° сводка всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’Π°Π±Π»ΠΈΡ†Π° 2.2. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

getopt_long()

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
0
getopt_long()
установила Ρ„Π»Π°Π³, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ
1
optarg
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° простой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки
'?' ΠΠ΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опция
' ' ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ
'x' Π‘ΠΈΠΌΠ²ΠΎΠ» ΠΎΠΏΡ†ΠΈΠΈ 'x'
-1 ΠšΠΎΠ½Π΅Ρ† ΠΎΠΏΡ†ΠΈΠΉ