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

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

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

2.4.2. ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ†Π΅Π»ΠΎΠΌ:

environ

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ способом Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ являСтся использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, описанных Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. Однако, стоит Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ».

Π’Π½Π΅ΡˆΠ½ΡΡ пСрСмСнная

environ
прСдоставляСт доступ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ способом, ΠΊΠ°ΠΊ
argv
прСдоставляСт доступ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π’Ρ‹ сами Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π₯отя ΠΎΠ½Π° ΠΈ стандартизирована POSIX,
environ
Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ объявлСна Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ стандартном Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ (Π­Ρ‚ΠΎ, каТСтся, прослСТиваСтся ΠΈΠ· историчСской ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.) Π’ΠΎΡ‚ объявлСниС:

extern char **environ; /* Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Π½Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° POSIX */

Как и в

argv
, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ элСмСнтом
environ
являСтся
NULL
. Однако, здСсь Π½Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ «числа строк окруТСния», которая соотвСтствовала Π±Ρ‹
argc
. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° распСчатываСт всС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅:

/* ch02-printenv.c --- Π Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. */

#include <stdio.h>

extern char **environ;

int main(int argc, char **argv) {

Β int i;

Β if (environ != NULL)

Β  for (i = 0; environ[i] != NULL; i++)

Β Β  printf("%s\n", environ[i]);

Β return 0;

}

Π₯отя это ΠΈ маловСроятно, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

environ
эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° провСряСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ Ρ€Π°Π²Π½Π°
NULL
.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ хранятся Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π² случайном порядкС. Π₯отя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Unix хранят ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния Π² отсортированном ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²ΠΈΠ΄Π΅, это Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ трСбуСтся, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π½Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΡ….

Π’ качСствС ΡƒΠ»ΠΎΠ²ΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ, объявив Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

main()
:

int main(int argc, char **argv, char **envp) {

Β ...

}

Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

envp
Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ
environ
. Π₯отя это ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² старом ΠΊΠΎΠ΄Π΅, ΠΌΡ‹ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊΠΎΠ΅ использованиС;
environ
являСтся ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ, стандартным, пСрСносимым способом получСния доступа ΠΊΠΎ всСму ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ, Ссли это Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

2.4.3. GNU

env

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π³Π»Π°Π²Ρƒ, рассмотрим GNU Π²Π΅Ρ€ΡΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

env
. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° добавляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ Π² Ρ…ΠΎΠ΄Π΅ выполнСния ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΆΠ΅ для очищСния окруТСния Π² Ρ…ΠΎΠ΄Π΅ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ для удалСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° обСспСчиваСт нас Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ проявляСт возмоТности ΠΊΠ°ΠΊ
getopt_long()
, Ρ‚Π°ΠΊ ΠΈ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностСй, ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠΈΡ…ΡΡ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ вызываСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°:

$ env --help

Usage: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

/* УстанавливаСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ VALUE для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ NAME ΠΈ запускаСт COMMAND */

-i, --ignore-environment /* Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с пустым ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ */

-u, --unset=NAMEΒ Β Β Β Β Β Β Β  /* ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ· окруТСния */

--helpΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  /* ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ этот экран справки ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ */

--versionΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β  /* вывСсти ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ вСрсии ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ */

/* ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ - ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ -1. Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π° COMMAND, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚

Β Β  ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ΡΡ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

Об ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… сообщайтС Π² <[email protected]>. */

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

$ <b>env - myprog arg1</b> /* ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с args */

$ <b>env - РАВН=/bin:/usr/bin myprog arg1</b> /* ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ PATH, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

$ <b>env -u IFS PATH=/bin:/usr/bin myprog arg1</b> /* Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ IFS, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ PATH, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

Код начинаСтся со стандартной Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ авторских ΠΏΡ€Π°Π² GNU ΠΈ Ρ€Π°Π·ΡŠΡΡΠ½ΡΡŽΡ‰Π΅Π³ΠΎ коммСнтария. ΠœΡ‹ для краткости ΠΈΡ… опустили. (Π€ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° авторского ΠΏΡ€Π°Π²Π° обсуТдаСтся Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘ Β«ΠžΠ±Ρ‰Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½Π°Ρ лицСнзия GNUΒ». Показанного Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π²ΠΎΠ΄Π°

--help
достаточно для понимания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.) Π—Π° ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ авторским ΠΏΡ€Π°Π²ΠΎΠΌ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ объявлСния. Π’Ρ‹Π·ΠΎΠ² макроса '
N_(&quot;string&quot;)
' (строка 93) ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для использования ΠΏΡ€ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Ρ‚Π΅ΠΌΠ°, освСщСнная Π² Π³Π»Π°Π²Π΅ 13 Β«Π˜Π½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ локализация». Пока Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, ΠΊΠ°ΠΊ содСрТащий ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу.

80Β  #include &lt;config.h&gt;

81Β  #include &lt;stdio.h&gt;

82Β  #include &lt;getopt.h&gt;

83Β  #include &lt;sys/types.h&gt;

84Β  #include &lt;getopt.h&gt;

85

86Β  #include &quot;system.h&quot;

87Β  #include &quot;error.h&quot;

88Β  #include &quot;closeout.h&quot;

89

90Β  /* ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ имя этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π½Π°ΠΏΡ€., Π½Π΅Ρ‚ прСфикса 'g'). */

91Β  #define PROGRAM_NAME &quot;env&quot;

92

93Β  #define AUTHORS N_ (&quot;Richard Mlynarik and David MacKenzie&quot;)

94

95Β  int putenv();

96

97Β  extern char **environ;

98

99Β  /* Имя, посрСдством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°. */

100 char *program_name;

101

102 static struct option const longopts[] =

103Β  {