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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 67

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

Π’ спСцификации UNIX ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ мноТСство стандартных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния, примСняСмых для самых Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‚ΠΈΠΏ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΈΠΌΠ΅Π½Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², установлСнных ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, названия часовых поясов ΠΈ Ρ‚.Π΄. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° языкС Π‘ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ окруТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

putenv
ΠΈ
getenv
.

<b>#include &lt;stdlib.h&gt;</b>

<b>char *getenv(const char *name);</b>

<b>int putenv(const char *string);</b>

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ· строк Π²ΠΈΠ΄Π°

имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
. Ѐункция
getenv
ΠΈΡ‰Π΅Ρ‚ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ строку с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ассоциированноС с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ. Она Π²Π΅Ρ€Π½Π΅Ρ‚
NULL
, Ссли трСбуСмая пСрСмСнная Π½Π΅ сущСствуСт. Если пСрСмСнная Π΅ΡΡ‚ΡŒ, Π½ΠΎ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, функция
getenv
Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Ρ€Π°Π²Π΅Π½
NULL
. Π‘Ρ‚Ρ€ΠΎΠΊΠ°, возвращаСмая
getenv
, хранится Π² статичСской памяти, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому для Π΅Π΅ дальнСйшСго использования Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту строку Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСзаписана ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
getenv
.Β 

Ѐункция

putenv
ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку Π²ΠΈΠ΄Π°
<i>имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅</i>
ΠΈ добавляСт Π΅Π΅ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. Она даст сбой ΠΈ Π²Π΅Ρ€Π½Π΅Ρ‚ -1, Ссли Π½Π΅ смоТСт Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ свободной памяти. Когда это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
errno
Π±ΡƒΠ΄Π΅Ρ‚ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
ENOMEM
.

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 4.4 Π²Ρ‹ напишeΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для Π²Ρ‹Π²ΠΎΠ΄Π° значСния любой Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π²Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния. Π£ вас Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.4. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ
getenv
ΠΈ
putenv

1.Β ΠŸΠ΅Ρ€Π²Ρ‹Π΅ нСсколько строк послС объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

main
Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ environ.c с Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &lt;string.h&gt;

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

Β char *var, *value;

Β if (argc == 1 || argc &gt; 3) {

Β  fprintf(stderr, &quot;usage: environ var [value]\n&quot;);

Β  exit(1);

Β }

2.Β Π‘Π΄Π΅Π»Π°Π² это, Π²Ρ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· окруТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

getenv
:

Β var = argv[1];

Β value = getenv(var);

Β if (value)

Β  printf(&quot;Variable %s has value %s\n&quot;, var, value);

Β else

Β  printf(&quot;Variable %s has no value\n&quot;, var);

3.Β Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π±Ρ‹Π» Π»ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π½ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Если Π±Ρ‹Π», Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, конструируя строку Π²ΠΈΠ΄Π°

<i>имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅</i>
ΠΈ Π·Π°Ρ‚Π΅ΠΌ вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
putenv
:

Β if (argc == 3) {

Β Β char *string;

Β Β value = argv[2];

Β  string = malloc(strlen(var)+strlen(value)+2);

Β Β if (!string} {

Β Β  fprintf(stderr, &quot;out of memory\n&quot;);

Β  Β exit(1);

Β  }

Β  strcpy(string, var);

Β Β strcat(string, &quot;=&quot;);

Β Β strcat(string, value);

Β  printf(&quot;Calling putenv with: %s\n&quot;, string);

Β Β if (putenv(string) != 0) {

Β Β  fprintf(stderr, &quot;putenv failed\n&quot;);

Β  Β free(string);

Β  Β exit(1);

Β  }

4.Β Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getenv Π΅Ρ‰Π΅ Ρ€Π°Π·:

Β  value = getenv(var);

Β Β if (value)

Β Β  printf(&quot;New value of %s is %s\n&quot;, var, value);

Β Β else

Β Β  printf(&quot;New value of %s is null??\n&quot;, var);

Β }

Β exit(0);

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния:

$ <b>./environ ΠΠžΠœΠ•</b>

Variable HOME has value /home/neil

$ <b>./environ FRED</b>

Variable FRED has no value

$ <b>./environ FRED hello</b>

Variable FRED has no value

Calling putenv with: FRED=hello

New value of FRED is hello

$ <b>./environ FRED</b>

Variable FRED has no value

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ локально ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ИзмСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π²Π½Π΅ Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса (вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ (ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ).

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ часто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния для измСнСния способа своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π°Ρ‚ΡŒ значСния этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния Π»ΠΈΠ±ΠΎ Π² ΠΈΡ… стандартном ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° .profile, Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΡ… рСгистрационной ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» запуска (rc) ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π»ΠΈΠ±ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. НапримСр,

$ <b>./environ FRED</b>

Variable FRED has no value

$ <b>FRED=hello ./environ FRED</b>