<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: странность с pipe()</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html</link>
    <description>Доброго времени суток!&lt;br&gt;&lt;br&gt;Вот тут странноя штука вышла с пайпом - написал простенькое перенаправление вывода, причем работает :) но, прихорашивая текст, обнаружил странность.&lt;br&gt;&lt;br&gt;В общем, создаю два пайпа и два потомка, у потомка stdin назначаю на pipe&#091;0&#093;, stdout - на файл, который в потомке и создается. Вот эта функция работает после форка для потомка.&lt;br&gt;&lt;br&gt;int run_child(char *output_file, int *fd)&lt;br&gt;&#123;&lt;br&gt;    int out;&lt;br&gt;    int c;&lt;br&gt;&lt;br&gt;    dup2(fd&#091;0&#093;, 0);&lt;br&gt;    close(fd&#091;0&#093;);&lt;br&gt;    close(fd&#091;1&#093;);&lt;br&gt;&lt;br&gt;    if(-1 != (out = open(output_file, O_CREAT &amp;#124; O_TRUNC &amp;#124; O_WRONLY, S_IREAD &amp;#124; S_IWRITE)))&#123;&lt;br&gt;dup2(out, 1);&lt;br&gt;close(out);&lt;br&gt;&lt;br&gt;execlp(&quot;cat&quot;, &quot;cat&quot;, NULL);&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;    exit(0);&lt;br&gt;&lt;br&gt;    return 0;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Родитель для каждого потомка пишет сообщение в пайп, закрывает дескрипторы и ждет завершения потомков.&lt;br&gt;&lt;br&gt;    for(i = 0; i &amp;lt; 2; i++)&#123;&lt;br&gt;if(0 &amp;gt; (task&#091;i&#093;.pid = fork()))&#123;&lt;br&gt;        printf(&quot;Fork error !&#092;n&quot;);&lt;br&gt;        exit(2);&lt;br&gt;        &#125;&lt;br&gt;if(task&#091;i&#093;.pid == 0)&lt;br&gt;        run_child(output_file&#091;i&#093;, task&#091;i&#093;.fd);&lt;br&gt;/*********</description>

<item>
    <title>Немогу разобраться с pipe и fork() (Mimik)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#21</link>
    <pubDate>Mon, 12 Nov 2012 13:08:52 GMT</pubDate>
    <description>прошло 4 года, читаю и смеюсь сам над собой =) вот глупый был =)))&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (phpcoder)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#20</link>
    <pubDate>Fri, 05 Sep 2008 10:50:59 GMT</pubDate>
    <description>Где хедеры stdio.h. и stdlib.h ?&lt;br&gt;&lt;br&gt;&amp;gt;int main() &lt;br&gt;&lt;br&gt;В Си если ф-ция не принимает параметров, лучше указывать void, т.е. в вашем случае правильнее будет&lt;br&gt;&lt;br&gt;int main(void)&lt;br&gt;&lt;br&gt;&amp;gt;&#123; &lt;br&gt;&amp;gt;char buf&#091;256&#093; = &quot;null&quot;; &lt;br&gt;&amp;gt;FILE *oms = popen(&quot;patch/OMStip T75 -done wan0&quot;,&quot;r&quot;); &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;if(!oms) &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;  printf(&quot;Error read file&#092;n&quot;); &lt;br&gt;&lt;br&gt;Сообщение об ошибках всё же лучше направлять в stderr. Ну и оно должно быть более читабельным, чем в вашем случае.&lt;br&gt;&lt;br&gt;&amp;gt;  return EXIT_FAILURE; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; else &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;  printf(&quot;Read run&#092;n&quot;); &lt;br&gt;&amp;gt;  fread(buf,1,256,oms); &lt;br&gt;&lt;br&gt;У вас размер буфера 256, как вы собрались туда прочитать 256 символов? А как же нулевой символ? Вы так можете получить ошибку off-by-one и выход за границы массива.&lt;br&gt;&lt;br&gt;&amp;gt;  printf(&quot;&#037;s&quot;,buf); &lt;br&gt;&amp;gt;  fclose(oms); &lt;br&gt;&lt;br&gt;fclose() используется для закрытия файловых дескрипторов, открытых с помощью fopen(). В вашем случае нужно pclose()&lt;br&gt;&lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;Здесь должен быть оператор return EXIT_SUCCESS;&lt;br&gt;&lt;br&gt;&amp;gt;&#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;но приложение отрабатывет со второго раза о_О, и после исполнения теряется фокус &lt;br&gt;&amp;gt;у ко</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (Mimik)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#19</link>
    <pubDate>Fri, 05 Sep 2008 10:24:45 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;P.S. Почитайте маны) &lt;br&gt;&amp;gt;&amp;gt;&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;коду получилось в 3 строчки =) &lt;br&gt;&amp;gt;но теперь по завершению в консоли потерян фокус =((( &lt;br&gt;&lt;br&gt;делаю так : &lt;br&gt;&lt;br&gt;int main()&lt;br&gt;&#123;&lt;br&gt;char buf&#091;256&#093; = &quot;null&quot;;&lt;br&gt;FILE *oms = popen(&quot;patch/OMStip T75 -done wan0&quot;,&quot;r&quot;);&lt;br&gt;&lt;br&gt;if(!oms)&lt;br&gt; &#123;&lt;br&gt;  printf(&quot;Error read file&#092;n&quot;);&lt;br&gt;  return EXIT_FAILURE;&lt;br&gt; &#125;&lt;br&gt; else&lt;br&gt; &#123; &lt;br&gt;  printf(&quot;Read run&#092;n&quot;);&lt;br&gt;  fread(buf,1,256,oms);&lt;br&gt;  printf(&quot;&#037;s&quot;,buf);&lt;br&gt;  fclose(oms);&lt;br&gt; &#125; &lt;br&gt;&lt;br&gt;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;но приложение отрабатывет со второго раза о_О, и после исполнения теряется фокус у консоли&lt;br&gt;в нее ничего нельзя ввести О_О как это побороть?&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (Mimik)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#18</link>
    <pubDate>Fri, 05 Sep 2008 09:53:13 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Не совсем так, потому что popen() возвращает FILE *, а read() ждёт &lt;br&gt;&amp;gt;&amp;gt;int в качестве файлового дескриптора. Так что вам, по-видимому, нужно fread() &lt;br&gt;&amp;gt;&amp;gt;использовать. &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;P.S. Почитайте маны) &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Угу уже поитал уже разобрался всем спасиб =) терь тока надо закрыть &lt;br&gt;&amp;gt;и все &lt;br&gt;&lt;br&gt;хм, открываю получаю данные закрываю&lt;br&gt;коду получилось в 3 строчки =)&lt;br&gt;но теперь по завершению в консоли потерян фокус =(((&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (Mimik)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#17</link>
    <pubDate>Fri, 05 Sep 2008 09:48:14 GMT</pubDate>
    <description>&amp;gt;&amp;gt;FILE *pid = popen(&quot;/local/mms-v20/lib/linux_v9/OMStip T75 -done wan0&quot;,&quot;r&quot;); &lt;br&gt;&amp;gt;&amp;gt; read(pid,buffer,255); &lt;br&gt;&amp;gt;&amp;gt;получается надыть так? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Не совсем так, потому что popen() возвращает FILE *, а read() ждёт &lt;br&gt;&amp;gt;int в качестве файлового дескриптора. Так что вам, по-видимому, нужно fread() &lt;br&gt;&amp;gt;использовать. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;P.S. Почитайте маны) &lt;br&gt;&lt;br&gt;Угу уже поитал уже разобрался всем спасиб =) терь тока надо закрыть и все&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (phpcoder)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#16</link>
    <pubDate>Fri, 05 Sep 2008 09:43:30 GMT</pubDate>
    <description>&amp;gt;FILE *pid = popen(&quot;/local/mms-v20/lib/linux_v9/OMStip T75 -done wan0&quot;,&quot;r&quot;); &lt;br&gt;&amp;gt; read(pid,buffer,255); &lt;br&gt;&amp;gt;получается надыть так? &lt;br&gt;&lt;br&gt;Не совсем так, потому что popen() возвращает FILE *, а read() ждёт int в качестве файлового дескриптора. Так что вам, по-видимому, нужно fread() использовать.&lt;br&gt;&lt;br&gt;&lt;br&gt;P.S. Почитайте маны)&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (Mimik)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#15</link>
    <pubDate>Fri, 05 Sep 2008 09:37:39 GMT</pubDate>
    <description>&amp;gt;&amp;gt;    pid = execlp(&quot;/local/mms-v20/lib/linux_v9/OMStip&quot;,&quot;OMStip&quot;,&quot;T75&quot;,&quot;-done&quot;,&quot;wan0&quot;,0); &lt;br&gt;&amp;gt;&amp;gt;    read(pid,buffer,255); &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Если мне не изменяет память, то ф-ции из семейства exec управление не &lt;br&gt;&amp;gt;возвращают, иными словами ваш read() даже не выполнится. Вам, видимо, нужно &lt;br&gt;&amp;gt;использовать popen(). &lt;br&gt;&lt;br&gt;FILE *pid = popen(&quot;/local/mms-v20/lib/linux_v9/OMStip T75 -done wan0&quot;,&quot;r&quot;);&lt;br&gt; read(pid,buffer,255);&lt;br&gt;получается надыть так?&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (phpcoder)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#14</link>
    <pubDate>Fri, 05 Sep 2008 07:04:53 GMT</pubDate>
    <description>&amp;gt;    pid = execlp(&quot;/local/mms-v20/lib/linux_v9/OMStip&quot;,&quot;OMStip&quot;,&quot;T75&quot;,&quot;-done&quot;,&quot;wan0&quot;,0); &lt;br&gt;&amp;gt;    read(pid,buffer,255); &lt;br&gt;&lt;br&gt;Если мне не изменяет память, то ф-ции из семейства exec управление не возвращают, иными словами ваш read() даже не выполнится. Вам, видимо, нужно использовать popen().&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Немогу разобраться с pipe и fork() (Mimik)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/4206.html#13</link>
    <pubDate>Fri, 05 Sep 2008 06:35:53 GMT</pubDate>
    <description>Всем привет помогите плиз с моей трабл, немогу разобраться в чес дело&lt;br&gt;я пытаюсь перенаправить вывод данных с программы исполняемой в execlp&lt;br&gt;но в буфер однозначно ничего не выводит, никак не могу понять почему &lt;br&gt;вот исходник может есть соображения :&lt;br&gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;malloc.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/stat.h&amp;gt;&lt;br&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br&gt;#include &amp;lt;signal.h&amp;gt;&lt;br&gt;int main()&lt;br&gt;&#123;&lt;br&gt;pid_t pid;&lt;br&gt;pid_t pido;&lt;br&gt;int pip&#091;2&#093;;&lt;br&gt;char buffer&#091;255&#093; = &quot;empty&quot;;&lt;br&gt;int status,died;&lt;br&gt; switch(fork())&lt;br&gt;&#123;&lt;br&gt; case -1 :&lt;br&gt;      printf(&quot;&#037;s&quot;,&quot;Error fork &#092;n&quot;);&lt;br&gt;      return EXIT_FAILURE;&lt;br&gt; case 0:&lt;br&gt;    printf(&quot;&#037;s&quot;,&quot;Run pid OMStip&#092;n&quot;);&lt;br&gt;    pipe(pip);&lt;br&gt;    close(0);&lt;br&gt;    dup2(pip&#091;1&#093;,1);&lt;br&gt;    close(pip&#091;0&#093;);&lt;br&gt;    close(0);&lt;br&gt;    pid = execlp(&quot;/local/mms-v20/lib/linux_v9/OMStip&quot;,&quot;OMStip&quot;,&quot;T75&quot;,&quot;-done&quot;,&quot;wan0&quot;,0); &lt;br&gt;    read(pid,buffer,255);&lt;br&gt;     close(pid);&lt;br&gt;     close(pip&#091;0&#093;);&lt;br&gt;     close(pip&#091;1&#093;);&lt;br&gt;    _exit(pip&#091;1&#093;);&lt;br&gt;&#125;&lt;br&gt;printf(&quot;out : &#092;n&quot;);&lt;br&gt;printf(&quot;&#037;s&#092;n&quot;,buffer);&lt;br&gt;close(0);&lt;br&gt;close(pip&#091;0</description>
</item>

</channel>
</rss>
