<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Дочерние процессы+консоль</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8472.html</link>
    <description>Совсем недавно начал разбираться в програмировании под Linux. И вот возникла проблема.&lt;br&gt;Допустим необходимо чтобы процесс proc вывел в исходный процесс строку blablabla.&lt;br&gt;void main()&lt;br&gt;&#123;&lt;br&gt;   WINDOW *wnd;&lt;br&gt;   //всякие там атрибуты и т.д.&lt;br&gt;  if(fork()==0)&lt;br&gt;execl(&quot;proc&quot;, &quot; blablabla&quot;, NULL);&lt;br&gt;&#125;&lt;br&gt;/* proc */&lt;br&gt;void main()&lt;br&gt;&#123;&lt;br&gt;   WINDOW *wnd;&lt;br&gt;   wprintw(wnd,argv&#091;1&#093;); &lt;br&gt;   wrefresh(wnd);&lt;br&gt;&#125;&lt;br&gt;При вызове proc субственно &quot;затирается&quot; консоль родительского процесса. Я так понимаю надо как-то передать индефикатор консоли родительского дочернему. В windows это легко делалось через GetStdHandle(STD_OUTPUT_HANDLE). Как же это сделать в Linux?&lt;br&gt;</description>

<item>
    <title>Дочерние процессы+консоль (Артур)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8472.html#5</link>
    <pubDate>Sun, 11 Oct 2009 09:44:11 GMT</pubDate>
    <description>не туда запостил, блин...&lt;br&gt;см. пост &amp;#8470;4&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Дочерние процессы+консоль (Артур)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8472.html#4</link>
    <pubDate>Sun, 11 Oct 2009 09:41:57 GMT</pubDate>
    <description>если я все правильно понял, советую перед форком создать пайп,&lt;br&gt;&lt;br&gt;int fds&#091;2&#093;;&lt;br&gt;pipe(fds);&lt;br&gt;&lt;br&gt;а дальше два варианта:&lt;br&gt;1. после форка подменить стдаут чилда пишущим концом трубы:&lt;br&gt;&lt;br&gt;char buf&#091;80&#093;;&lt;br&gt;if (!fork()) &#123;&lt;br&gt;    close(STDOUT_FILENO);&lt;br&gt;    dup2(fds&#091;1&#093;, STDOUT_FILENO);&lt;br&gt;    close(fds&#091;1&#093;);&lt;br&gt;    execl(&quot;proc&quot;, &quot; blablabla&quot;, NULL);&lt;br&gt;    /* unreached */&lt;br&gt;&#125;&lt;br&gt;// любой f&#091;w&#093;printf(stdout, ...) в чилде будет попадать в fds&#091;0&#093;&lt;br&gt;FILE *pin = fdopen(fds&#091;0&#093;, &quot;r&quot;);&lt;br&gt;fgets(buf, sizeof(buf), pin);&lt;br&gt;&lt;br&gt;2. передать proc&apos;у дескриптор в виде строки в качестве второго параметра (там его подцепите как pout и передавайте в f&#091;w&#093;printf&apos;ы)&lt;br&gt;&lt;br&gt;в обоих случаях следите за fflush(3)&lt;br&gt;</description>
</item>

<item>
    <title>Дочерние процессы+консоль (elvenic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8472.html#3</link>
    <pubDate>Sat, 10 Oct 2009 11:51:57 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;хочет что-то вывести в окно на этом терминале, он должен культурно &lt;br&gt;&amp;gt;&amp;gt;попросить об этом хозяина терминала - родительский процесс. Например, можно открыть &lt;br&gt;&amp;gt;&amp;gt;pipe между двумя процессами (или использовать какое-то другое средство inter-process communication) &lt;br&gt;&amp;gt;&amp;gt;и создать протокол передачи данных от процесса который хочет что-то сказать &lt;br&gt;&amp;gt;&amp;gt;в окно, процессу - хозяину терминала. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Вы имеете ввиду передачу из дочернего процесса строки в родительский и вывод &lt;br&gt;&amp;gt;из родительского? Если да, то необходимо выводить именно из дочернего. Если &lt;br&gt;&amp;gt;же нет, то немогли бы вы привети пример куска кода с &lt;br&gt;&amp;gt;подобным запросом. &lt;br&gt;&lt;br&gt;Да, я имею в виду именно передачу из дочернего процесса строки в родительский и вывод из родительского процесса. Как я уже говорил, два curses&apos;а из двух различных процессов на одном терминале работать не могут. Т.е, нельзя создать curses-окно в родительском процессе, передать его &quot;хендл&quot; в дочерний и выводить в это окно строки в дочернем процессе: дочерний curses начнет </description>
</item>

<item>
    <title>Дочерние процессы+консоль (Hromonin)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8472.html#2</link>
    <pubDate>Sat, 10 Oct 2009 08:53:53 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;curses в родительском процессе, и пытается полностью контролировать терминал по своему. &lt;br&gt;&amp;gt;Что, понятно, конфликтует с тем фактом что curses в родительском процессе &lt;br&gt;&amp;gt;то-же хочет полностью контролировать терминал. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Мораль: терминал должен контролировать один процесс. Например, родительский. И если дочерний процесс &lt;br&gt;&amp;gt;хочет что-то вывести в окно на этом терминале, он должен культурно &lt;br&gt;&amp;gt;попросить об этом хозяина терминала - родительский процесс. Например, можно открыть &lt;br&gt;&amp;gt;pipe между двумя процессами (или использовать какое-то другое средство inter-process communication) &lt;br&gt;&amp;gt;и создать протокол передачи данных от процесса который хочет что-то сказать &lt;br&gt;&amp;gt;в окно, процессу - хозяину терминала. &lt;br&gt;&lt;br&gt;Вы имеете ввиду передачу из дочернего процесса строки в родительский и вывод из родительского? Если да, то необходимо выводить именно из дочернего. Если же нет, то немогли бы вы привети пример куска кода с подобным запросом.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Дочерние процессы+консоль (elvenic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8472.html#1</link>
    <pubDate>Fri, 09 Oct 2009 15:01:54 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;/* proc */ &lt;br&gt;&amp;gt;void main() &lt;br&gt;&amp;gt;&#123; &lt;br&gt;&amp;gt;   WINDOW *wnd; &lt;br&gt;&amp;gt;   wprintw(wnd,argv&#091;1&#093;); &lt;br&gt;&amp;gt;   wrefresh(wnd); &lt;br&gt;&amp;gt;&#125; &lt;br&gt;&amp;gt;При вызове proc субственно &quot;затирается&quot; консоль родительского процесса. Я так понимаю надо &lt;br&gt;&amp;gt;как-то передать индефикатор консоли родительского дочернему. В windows это легко делалось &lt;br&gt;&amp;gt;через GetStdHandle(STD_OUTPUT_HANDLE). Как же это сделать в Linux? &lt;br&gt;&lt;br&gt;По моему, вы что-то путаете. Если вы хотите просто вывести из дочернего процесса строчку на терминал, то это можно сделать просто функцией printf() - она выводит на standard output, чей файл-дескриптор наследуется дочерними процессами - все открытые файл-дескрипторы так наследуются. Соответственно, файл-дескриптор standard output&apos;a дочернего процесса это тот же файл-дескриптор что и файл-дескриптор standard output&apos;a родительского процесса, и если у родительского процесса это дескриптор его терминала, значит и у дочернего процесса это дескриптор того-же терминала.&lt;br&gt;&lt;br&gt;Но если вы в родительском процессе используете curses, создае</description>
</item>

</channel>
</rss>
