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

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

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

НаконСц, ΠΌΡ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ°Π·Π°Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

switch
ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ:

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

char *myfile, *user; /* Ρ„Π°ΠΉΠ» Π²Π²ΠΎΠ΄Π°, имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ */

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 },

Β { "user" , optional_argument, NULL, 'u'},

Β { 0, 0, 0, 0 }

};

...

while((c=getopt_long(argc, argv, ":ahvf:u::W;", longopts, NULL)) != -1) {

Β switch (c) {

Β case 'a':

Β  do_all = 1;

Β  break;

Β case 'f':

Β  myfile = optarg;

Β  break;

Β case 'h':

Β  do_help = 1;

Β  break;

Β case 'u':

Β  if (optarg != NULL)

Β Β  user = optarg;

Β  else

Β Β  user = "root";

Β  break;

Β case 'v':

Β  do_verbose = 1;

Β  break;

Β case 0:

Β  /* getopt_long() установил ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, просто ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ */

Β  break;

#if 0

Β case 1:

Β  /*

Β Β  * Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот case, Ссли getopt_long() Π΄ΠΎΠ»ΠΆΠ½Π°

Β Β  * ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π’ этом случаС Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ

Β Β  * optstring Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ * символ '-'. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄,

Β Β  * Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ здСсь.

Β Β  */

Β  break;

#endif

Β case ':': /* отсутствуСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ */

Β  fprintf(stderr, "%s: option '-%c' requires an argument\n",

Β Β  argv[0], optopt);

Β  break;

Β case '?':

Β default: /* Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опция */

Β  fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",

Β Β  argv[0], optopt);

Β  break;

Β }

}

Π’ своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠ΅ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако, Ссли Π²Ρ‹ использовали ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа ΠΎΠΏΡ†ΠΈΠΈ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΡƒΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ Π½ΡƒΠΆΠ½Ρ‹. (Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅

do_verbose
ΠΈ
vflag
.)

2.3.3.4. GNU

getopt()
ΠΈΠ»ΠΈ
getopt_long()
Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… GNU

getopt()
ΠΈΠ»ΠΈ
getopt_long()
ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Π½Π΅-Linux систСмах/ Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ; просто скопируйтС исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ GNU ΠΈΠ»ΠΈ ΠΈΠ· CVS Π°Ρ€Ρ…ΠΈΠ²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ GNU (GLIBC) [30]. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
getopt.h
,
getopt.с
ΠΈ
getopt1.c
. Они Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° условиях мСньшСй общСдоступной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ (Lesser General Public License) GNU, которая позволяСт Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°ΠΆΠ΅ Π² ΠΏΠ°Ρ‚Π΅Π½Ρ‚ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ копию Ρ„Π°ΠΉΠ»Π°
COPYING.LIB
наряду с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
getopt.h
,
getopt.с
ΠΈ
getopt1.с
.

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π² свой дистрибутив ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ исходными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’ исходном ΠΊΠΎΠ΄Π΅, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ

getopt_long()
, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ '
#include <getopt.h>
', Π° Π½Π΅ '
#include "getopt.h"
'. Π—Π°Ρ‚Π΅ΠΌ, ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС компилятора Π‘
-I
. Π’Π°ΠΊΠΈΠΌ способом сначала Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° локальная копия Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ: Β«Π’ΠΎΡ‚ Ρ‚Π°ΠΊ, я ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ GNU/Linux. ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ

getopt_long()
Π² свой исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, увСличивая Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, Ссли ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΡƒΠΆΠ΅ находится Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π‘?Β» Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ вопрос. Однако, здСсь Π½Π΅ ΠΎ Ρ‡Π΅ΠΌ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ построСн Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ссли ΠΎΠ½ компилируСтся Π½Π° систСмС, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ GLIBC, ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°! Π’ΠΎΡ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° нашСй систСмС:

$ <b>uname -Π°</b> /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ имя ΠΈ Ρ‚ΠΈΠΏ систСмы */

Linux example 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux

$ <b>ls -l getopt.ΠΎ getopt1.ΠΎ</b> /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² */

-rw-r--r-- 1 arnold devel 9836 Mar 24 13:55 getopt.ΠΎ

-rw-r--r-- 1 arnold devel 10324 Mar 24 13:55 getopt1.ΠΎ

$ <b>size getopt.ΠΎ getopt1.ΠΎ</b> /* ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² исполняСмый

ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ */

text data bss dec hex filename

0 0 0 0 0 getopt.ΠΎ

0 0 0 0 0 getopt1.ΠΎ

Команда

size
ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… составных частСй Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π°. ΠœΡ‹ объясним Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.1 «АдрСсноС пространство Linux/UnixΒ». Π§Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ прямо сСйчас, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ нСсмотря Π½Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ самих Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠ½ΠΈ Π½Π΅ вносят Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΊΠ»Π°Π΄Π° Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. (Π”ΡƒΠΌΠ°Π΅ΠΌ, это достаточно ясно.)