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

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

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

121    program_name);

122   fputs (_("\

123    Set each NAME to VALUE in the environment and run COMMAND. \n\

124    \n\

125    -i, --ignore-environment start with an empty environment\n\

126    -u, --unset=NAME remove variable from the environment\n\

127    "), stdout);

128   fputs(HELP_OPTION_DESCRIPTION, stdout);

129   fputs(VERSION_OPTION_DESCRIPTION, stdout);

130   fputs(_("\

131    \n\

132    A mere - implies -i. If no COMMAND, print the resulting\

133    environment.\n"), stdout);

134   printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);

135  }

136  exit(status);

137 }

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ main() ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ настраиваСт Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ setlocale(), bindtextdomain() ΠΈ textdomain() (строки 147–149) ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 13 Β«Π˜Π½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ локализация». ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ main() envp (строка 140). Π­Ρ‚ΠΎ СдинствСнная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Coreutils, которая Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π΅Ρ‚. НаконСц, Π²Ρ‹Π·ΠΎΠ² atexit() Π² строкС 151 (см. Ρ€Π°Π·Π΄Π΅Π» 9.1.5.3. Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡΒ») рСгистрируСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Coreutils, которая ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ всС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ stdout, выдавая сообщСниС ΠΏΡ€ΠΈ ошибкС. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ getopt_long().

139 int

140 main(register int argc, register char **argv, char **envp)

141 {

142  char *dummy_environ[1];

143  int optc;

144  int ignore_environment = 0;

145

146  program_name = argv[0];

147  setlocale(LC_ALL, "");

148  bindtextdomain(PACKAGE, LOCALEDIR);

149  textdomain(PACKAGE);

150

151  atexit(close_stdout);

152

153  while ((optc = getopt_long(argc, argv, "+iu:", longopts, NULL)) != -1)

154  {

155   switch (optc)

156   {

157   case 0:

158    break;

159   case 'i':

160    ignore_environment = 1;

161    break;

162   case 'u':

163    break;

164   case_GETOPT_HELP_CHAR;

165   case_GETOPT_VERSION_CHAR(PROGRAM_NAME, AUTHORS);

166   default:

167    usage(2);

168   }

169  }

170

171  if (optind != argc && !strcmp(argv[optind], "-"))

172   ignore_environment = 1;

Π’ΠΎΡ‚ ΠΎΡ‚Ρ€Ρ‹Π²ΠΎΠΊ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° src/sys2.h Π² дистрибутивС Coreutils с упомянутыми Ρ€Π°Π½Π΅Π΅ опрСдСлСниями ΠΈ макросом 'case_GETOPT_xxx', ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ (строки 164–165):

/* ВынСсСниС Π·Π° скобки ΠΎΠ±Ρ‰Π΅ΠΉ части ΠΊΠΎΠ΄Π°, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ --help ΠΈ

   --version. */

/* Π­Ρ‚ΠΈ значСния пСрСчислСния Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ со значСниями ΠΎΠΏΡ†ΠΈΠΉ,

   ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ CHAR_MAX + 1 ΠΈ Ρ‚.Π΄. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅

   CHAR_MIN - 1, Ρ‚.ΠΊ. ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ -1, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ†ΠΈΠΉ getopt.

*/

enum {

 GETOPT_HELP_CHAR = (CHAR_MIN β€” 2),

 GETOPT_VERSION_CHAR = (CHAR_MIN - 3)

};

#define GETOPT_HELP_OPTION_DECL \

 "help", no_argument, 0, GETOPT_HELP_CHAR

#define GETOPT_VERSION_OPTION_DECL \

 "version", no_argument, 0, GETOPT_VERSION_CHAR

#define case_GETOPT_HELP_CHAR \

 case GETOPT_HELP_CHAR: \

  usage(EXIT_SUCCESS); \

  break;

#define case_GETOPT_VERSION_CHAR(Program_name, Authors) \

 case GETOPT_VERSION_CHAR: \

  version_etc(stdout, Program_name, PACKAGE, VERSION, Authors); \

  exit(EXIT_SUCCESS); \

  break;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ этого ΠΊΠΎΠ΄Π° являСтся ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ сообщСния ΠΎΠ± использовании ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для --help ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ вСрсии для --version. ОбС ΠΎΠΏΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ (Β«Π£ΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉΒ» ΠΈ Β«Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉΒ» статусы Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ описаны Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.1.5.1 Β«ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ статуса Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса».) ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Coreutils входят дСсятки ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΈΠΌΠ΅Π΅Ρ‚ смысл вынСсти Π·Π° скобки ΠΈ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π°.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ env.с:

174 environ = dummy_environ;

175 environ[0] = NULL;

176

177 if (!ignore_environment)

178  for (; *envp; envp++)

179   putenv(*envp);

180

181 optind = 0; /* ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ рСинициализация GNU getopt. */

182 while ((optc = getopt_long(argc, argv, "+iu:", longopts, NULL)) != -1)

183  if (optc == 'u')

184   putenv(optarg); /* ВрСбуСтся GNU putenv. */

185

186 if (optind !=argc && !strcmp(argv[optind], "-")) /* ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ */

187  ++optind;

188

189 while (optind < argc && strchr(argv[optind], '=')) /* Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ

     ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния * /

190 putenv(argv[optind++]);

191

192 /* Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π°, Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ. */

193 if (optind == argc)

194 {

195  while (*environ)

196   puts (*environ++);

197  exit(EXIT_SUCCESS);

198 }

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 174–179 пСрСносят ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π½ΠΎΠ²ΡƒΡŽ копию окруТСния. Π’ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ environ помСщаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° пустой Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ массив. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ envp ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ доступ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 181–184 ΡƒΠ΄Π°Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠΏΡ†ΠΈΠΈ -u. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° осущСствляСт это, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ сканируя ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку ΠΈ удаляя пСрСчислСнныС Ρ‚Π°ΠΌ ΠΈΠΌΠ΅Π½Π°. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния основываСтся Π½Π° ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅ΠΉΡΡ Ρ€Π°Π½Π΅Π΅ особСнности GNU putenv(): ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ с ΠΎΠ΄Π½ΠΈΠΌ лишь ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π±Π΅Π· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ значСния) putenv() удаляСт Π΅Π΅ ΠΈΠ· окруТСния.

ПослС ΠΎΠΏΡ†ΠΈΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 189–190 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ сканированиС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, отыскивая установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния Π² Π²ΠΈΠ΄Π΅ 'имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅'.

По достиТСнии строки 192, Ссли Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, прСдполагаСтся, Ρ‡Ρ‚ΠΎ env ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Она это ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ (строки 195–197).

Если ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ, ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ этой Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° execvp() (строка 200), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½ΠΎΠ²ΠΎΠΉ. (Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² обсуТдаСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.1.4 «Запуск Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: сСмСйство exec()Β»; ΠΏΠΎΠΊΠ° Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ ΠΎ дСталях.) Если этот Π²Ρ‹Π·ΠΎΠ² возвращаСтся Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΠ½ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Π» Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС env Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

200  execvp(argv[optind], &argv[optind]);

201

202  {

203   int exit_status = (errno == ENOENT ? 127 : 126);

204   error(0, errno, "%s", argv[optind]);

205   exit(exit_status);

206  }

207 }

ЗначСния ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ 126 ΠΈ 127 (опрСдСляСмыС Π² строкС 203) ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ стандарту POSIX. 127 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ execvp() ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Π½Π΅ сущСствуСт. (ENOENT ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» Π½Π΅ содСрТит записи Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.) 126 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» сущСствуСт, Π½ΠΎ Π±Ρ‹Π»Π° какая-Ρ‚ΠΎ другая ошибка.

2.5. РСзюмС

β€’ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ своСй ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ argc ΠΈ argv. Ѐункция getopt() прСдоставляСт стандартный способ для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΎΠΏΡ†ΠΈΠΉ ΠΈ ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² GNU вСрсия getopt() прСдоставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, a getopt_long() ΠΈ getopt_long_only() Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ.

β€’ ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ прСдставляСт собой Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€ 'имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ каТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° наслСдуСт ΠΎΡ‚ своСго родитСля. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎ ΠΏΡ€ΠΈΡ…ΠΎΡ‚ΠΈ своСго Π°Π²Ρ‚ΠΎΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния своСго повСдСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Для получСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния, измСнСния ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ удалСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ стандартныС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ (getenv(), setenv(), putenv() ΠΈ unsetenv()). ΠŸΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠΎ всСму ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· внСшнюю ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ environ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ char **envp Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(). ПослСдний способ Π½Π΅ рСкомСндуСтся.

УпраТнСния

1. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ -a, -b ΠΈ -с, ΠΈ Ρ‡Ρ‚ΠΎ -b Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ для этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠΎΠ΄ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Π΅Π· использования getopt() ΠΈΠ»ΠΈ getopt_long(). Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΡ†ΠΈΠΉ принимаСтся --. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ -ас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ -bYANKEES, -b YANKEES ΠΈ -abYANKEES. ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

2. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ getopt(). Для ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ насчСт случая 'optstring[0] == ':''. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ opterr.

3. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ для 'optstring[0] == ':'' ΠΈ opterr ΠΊ своСй вСрсии getopt().

4. Π Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°ΠΉΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ GNU getopt.h, getopt.с ΠΈ getopt1.с.

5. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΊΠ°ΠΊ environ, Ρ‚Π°ΠΊ ΠΈ envp, ΠΈ сравнитС ΠΈΡ… значСния.

6. Π Π°Π·Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ ΠΎΠΏΡ†ΠΈΠΉ являСтся Ρ‚Π΅ΠΌ колСсом, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ люди Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вновь. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, ΠΏΠΎΠΌΠΈΠΌΠΎ getopt() ΠΈ getopt_long(), Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ: