<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109089</guid>
        <pubDate>Thu, 10 Oct 2002 11:11:16 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109089</link>
        <description><![CDATA[borunov: 2 alexsh:<br><br>Я не первый год в юниксе и уверен, что ты ошибаешься. Но все-таки, я проделал следующие действия ;) :<br><br>#env<br>&lt;длинный список переменных- skipped&gt;<br>#echo . export MY_VAR=MY_VALUE &gt;&gt; /etc/inittab<br>#init q<br>#env<br>&lt;почти тот же самый длинный список, в нем MY_VAR не фигурирует&gt;<br>#uname -a<br>OSF1 ruaxp1.skipped.skipped.skipped V5.1 1885 alpha<br><br>Что и требовалось доказать. Проделал я это (как ты видишь) на Compaq True64 V5.1A (Rev.1885). К такому же результату (вернее к его отсутствию) приводит это и на HP-UX 11.0 (uname -a: &quot;HP-UX mguors B.11.00 U 9000/800 101901597 unlimited-user license&quot;). Дома могу проверить с FreeBSD 4.6.2, но думаю смысла в этом нет.<br><br>Если я проделал не то, что ты от меня хотел - объясни, что мне сделать, чтоб MY_VAR от init-а до шелла дошел по иерархии :).<br><br>Я же говорю - нет такого способа. У процессов память изолирована друг от дружки, пока явно не попросишь ее разделять (shared memory, etc....) с кем-то еще.]]></description>
        <author>borunov</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109087</guid>
        <pubDate>Thu, 10 Oct 2002 08:15:48 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109087</link>
        <description><![CDATA[alexsh: Не хочу вступать в длинную дисскуссию, просто предлагау выполнить приведенную мною выше инструкцию &quot;. export MY_ENV=MY_VALUE&quot; &nbsp;и проверить, установлены переменные окружения, или нет. Зарание скажу, что проверял на AIX, COMPAQ Tru64, SUN/SOLARIS.<br>И кстати, обрати внимание, что я ни словом не обмолвился о putenv() function, так как она действует именно так, как ты описал.]]></description>
        <author>alexsh</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109086</guid>
        <pubDate>Thu, 10 Oct 2002 05:21:30 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109086</link>
        <description><![CDATA[borunov: 2 alexsh:<br>Неправ как раз ты - допускаешь очень распространенную ошибку. Давай рассмотрим упрощенный пример, эквивалентный поведению init (не циклический и без навороченных конфигов)<br><br>Вот смотри код ниже - он делает следующее:<br> &nbsp; &nbsp;1. запускает отцовский процесс<br> &nbsp; &nbsp;2. отец распечатывает свои переменные среды<br> &nbsp; &nbsp;3. отец запускает ребенка<br> &nbsp; &nbsp;4. отец меняет среду<br> &nbsp; &nbsp;5. отец распечатывает свои переменные среды<br> &nbsp; &nbsp;6. ребенок распечатывает свои переменные среды<br><br><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>/*for printf(), perror()*/<br>#include &lt;stdio.h&gt;<br>/*for putenv()*/<br>#include &lt;stdlib.h&gt;<br>/*for fork(), sleep()*/<br>#include &lt;unistd.h&gt;<br>/*for wait()*/<br>#include &lt;sys/types.h&gt;<br>#include &lt;sys/wait.h&gt;<br><br>extern char **environ;<br>int child_stat;<br><br>void print_env (header)<br> &nbsp; &nbsp;char *header;<br>{<br> &nbsp; &nbsp;int i;<br><br> &nbsp; &nbsp;printf (&quot;-= \%s =-\n&quot;, header);<br> &nbsp; &nbsp;for (i = 0; environ[i] != NULL; i++)<br> &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;\%s\n&quot;, environ[i]);<br>}<br>int main (argc, argv, env)<br> &nbsp; &nbsp;int argc;<br> &nbsp; &nbsp;char **argv;<br> &nbsp; &nbsp;char **env;<br>{<br> &nbsp; &nbsp;print_env (&quot;Father, before environ changes&quot;);<br><br> &nbsp; &nbsp;/*Let's born a child*/<br> &nbsp; &nbsp;switch (fork ())<br> &nbsp; &nbsp;{<br> &nbsp; &nbsp; &nbsp; &nbsp;case 0: /*Child*/<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sleep (2); /*Child's and father's output do not overlap*/<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print_env(&quot;Child, after father's environ changes&quot;);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br><br> &nbsp; &nbsp; &nbsp; &nbsp;case -1: /*Error*/<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;perror (&quot;Could not fork()&quot;);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br><br> &nbsp; &nbsp; &nbsp; &nbsp;default: /*Father*/<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;putenv (&quot;LAMER=TEST&quot;); /* It changes &quot;environ&quot;, but not &quot;env&quot;*/<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print_env (&quot;Father, after environ changes&quot;);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;wait (&amp;child_stat); /*Wait for child to terminate*/<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br> &nbsp; &nbsp;}<br> &nbsp; &nbsp;return 0;<br>}</div></div><br>Как нетрудно видеть после исполнения этого кода - первая и третья распечатки среды будут одинаковы, а вот вторая - будет иметь новую переменную LAMER. Это значит, что уже работающий процесс не получает никакого уведомления, если его отец меняет свою среду. Если бы я поместил в коде putenv() до вызова fork(), то ребенок имел бы уже измененную среду, так как он был бы порожден после ее изменения.<br><br>Теперь объясняю, в чем твоя ошибка с init.... init - самый первый процесс в системе. Все остальные процессы стартуют из-под него и после него, образуя многоуровневую иерархию (я здесь не рассматриваю виртуальные треды ядра и т.п. вирт. процессы). Естественно, что они наследуют все его перменные среды. Потом они их, конечно могут удалять и менять в своем контексте.<br><br>Поставь эксперимент - измени в своей системе файл inittab, добавив какую-нибудь переменную. Стрельни по init-у HUP-сигналом, чтоб он перечитал конфиг. И что ты видишь - изменилась в твоем текущем шелле среда? добавилась новая переменная? ну конечно нет, хоть твой шелл и потомок init-а (не сын, но правнук), до него эти изменения не дойдут. Но если init запустит что-то после твоего HUP-а, то новые процессы уже отнаследуют новую переменную среды.<br><br>Кстати, init очень часто растартует процессы, которые описаны в его конфиге и по какой-то причине померли - см. например &quot;respawn&quot; в man-е по init.]]></description>
        <author>borunov</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109084</guid>
        <pubDate>Wed, 09 Oct 2002 17:59:59 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109084</link>
        <description><![CDATA[alexsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>borunov, 07.10.02, 10:26:24</span><div class='quote '><br><br>Ответ очень прост - никак. Из потомка нет доступа к environment предка. То, что ты запускаешь с помощью system() исполняется шеллом, который будет потомком твой программы. Если ты в потомке взвел какие-то переменные среды, то родитель о них ничего не узнает, так как адресные пространства у процессов не пересекаются.<br><br>Единственное, что ты можешь сделать, это исправить <span class='tag-u'>собственную</span> среду окружения твоей проги. Это можно сделать (как правильно отметил makedonskij) с помощью setenv(). Такая переменная среды будет наследоваться всеми новыми потомками твоей програмыы (среда старых потомков не изменится )</div></div><br><br>Неправда. Инструкция &quot;. export MY_ENV=MY_VALUE&quot; определяет переменную окружения в процессе init. Соответственно, вся иерархия процессов данной сессии видит установленную переменную окружения]]></description>
        <author>alexsh</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109081</guid>
        <pubDate>Mon, 07 Oct 2002 06:26:24 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109081</link>
        <description><![CDATA[borunov: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В сишной пронрамме я пользуюсь функцией system(); <br> <br>system('some_command'\nA=$?); <br> <br>Как сделать так, чтобы эту переменную А можно было взять через getenv(), <br>т.е. что еще нужно добавить, чтобы она появилась в переменных окружения интерпретатора, из-под которого запускается моя программа на С. <br> <br>Спасибо. </div></div><br><br>Ответ очень прост - никак. Из потомка нет доступа к environment предка. То, что ты запускаешь с помощью system() исполняется шеллом, который будет потомком твой программы. Если ты в потомке взвел какие-то переменные среды, то родитель о них ничего не узнает, так как адресные пространства у процессов не пересекаются.<br><br>Единственное, что ты можешь сделать, это исправить <span class='tag-u'>собственную</span> среду окружения твоей проги. Это можно сделать (как правильно отметил makedonskij) с помощью setenv(). Такая переменная среды будет наследоваться всеми новыми потомками твоей програмыы (среда старых потомков не изменится )]]></description>
        <author>borunov</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109079</guid>
        <pubDate>Sun, 06 Oct 2002 19:25:49 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109079</link>
        <description><![CDATA[makedonskij: setenv(...)]]></description>
        <author>makedonskij</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109077</guid>
        <pubDate>Sat, 05 Oct 2002 06:19:47 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109077</link>
        <description><![CDATA[Aleks: А под каким шелом прога то выполняется?<br>для bash<br>system(&quot;MY_VAR=eprst; export MY_VAR&quot;);<br><br>для tc<br>system(&quot;setenv MY_VAR eprst&quot;);<br>]]></description>
        <author>Aleks</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109076</guid>
        <pubDate>Tue, 17 Sep 2002 13:06:33 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109076</link>
        <description><![CDATA[alexsh: system(&quot;export MY_ENV_VARIABLE=MY_VALUE&quot;);<br><br>no pravilnee inicializirovat' vse peremennie pri otkritiy novoy sessiy]]></description>
        <author>alexsh</author>
        <category>*nix</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109074</guid>
        <pubDate>Tue, 17 Sep 2002 12:17:03 +0000</pubDate>
        <title>Переменные в Shell</title>
        <link>https://forum.sources.ru/index.php?showtopic=12257&amp;view=findpost&amp;p=109074</link>
        <description><![CDATA[alkor: В сишной пронрамме я пользуюсь функцией system();<br><br>system('some_command'\nA=$?);<br><br>Как сделать так, чтобы эту переменную А можно было взять через getenv(),<br>т.е. что еще нужно добавить, чтобы она появилась в переменных окружения интерпретатора, из-под которого запускается моя программа на С.<br><br>Спасибо.]]></description>
        <author>alkor</author>
        <category>*nix</category>
      </item>
	
      </channel>
      </rss>
	