<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Umleitung für stdout]]></title><description><![CDATA[<p>Kann ein Prozess seine eigenen Ausgaben an stdout abfangen? Alle gefundenen Beispiele sind darauf ausgelegt, die Ausgaben anderer Prozesse einzufangen. Beim eigenen Prozess gibt es aber Probleme.</p>
<p>Dieser Code aus ist diversen Tipps und Beispielen aus dem Netz zusammengeschustert:</p>
<p>Setup:</p>
<pre><code class="language-cpp">static const char *PIPENAME_OUT = &quot;\\\\.\\pipe\\LOOPBACK_STDOUT&quot;;

mOutPipe = CreateNamedPipe(PIPENAME_OUT, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, 4096, 4096, 500, 0);
if(mOutPipe != INVALID_HANDLE_VALUE)
    freopen(PIPENAME_OUT, &quot;wb&quot;, stdout);
... 	
if(mOutPipe != INVALID_HANDLE_VALUE)
    mPipeThread.run();
</code></pre>
<p>Thread:</p>
<pre><code class="language-cpp">while(true)
{	
    fflush(stdout);
    while(PeekNamedPipe(mOutPipe, 0, 0, 0, &amp;total, 0) &amp;&amp; total &gt; 0)
    {
        DWORD rd = 0;
        if(ReadFile(mOutPipe, StdOutBuffer, STDBUFFERSIZE-1, &amp;rd, 0))
        {
             // ausgabe...
        }
    }
    Sleep(50);
}
</code></pre>
<p>Mit diesem Code hagelt es Deadlocks in WriteFile (das indirekt von printf/cout aufgerufen wird) in unregelmäßigen Abständen. Die Umleitung funktioniert prinzipiell.</p>
<p>Ich würde gerne wissen, wie eine solche Umleitung korrekt umgesetzt werden muss, dass ein Prozess seine eigene Ausgaben verlässlich darstellen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176533/umleitung-für-stdout</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 21:52:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176533.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Mar 2007 09:31:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 09:31:42 GMT]]></title><description><![CDATA[<p>Kann ein Prozess seine eigenen Ausgaben an stdout abfangen? Alle gefundenen Beispiele sind darauf ausgelegt, die Ausgaben anderer Prozesse einzufangen. Beim eigenen Prozess gibt es aber Probleme.</p>
<p>Dieser Code aus ist diversen Tipps und Beispielen aus dem Netz zusammengeschustert:</p>
<p>Setup:</p>
<pre><code class="language-cpp">static const char *PIPENAME_OUT = &quot;\\\\.\\pipe\\LOOPBACK_STDOUT&quot;;

mOutPipe = CreateNamedPipe(PIPENAME_OUT, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, 4096, 4096, 500, 0);
if(mOutPipe != INVALID_HANDLE_VALUE)
    freopen(PIPENAME_OUT, &quot;wb&quot;, stdout);
... 	
if(mOutPipe != INVALID_HANDLE_VALUE)
    mPipeThread.run();
</code></pre>
<p>Thread:</p>
<pre><code class="language-cpp">while(true)
{	
    fflush(stdout);
    while(PeekNamedPipe(mOutPipe, 0, 0, 0, &amp;total, 0) &amp;&amp; total &gt; 0)
    {
        DWORD rd = 0;
        if(ReadFile(mOutPipe, StdOutBuffer, STDBUFFERSIZE-1, &amp;rd, 0))
        {
             // ausgabe...
        }
    }
    Sleep(50);
}
</code></pre>
<p>Mit diesem Code hagelt es Deadlocks in WriteFile (das indirekt von printf/cout aufgerufen wird) in unregelmäßigen Abständen. Die Umleitung funktioniert prinzipiell.</p>
<p>Ich würde gerne wissen, wie eine solche Umleitung korrekt umgesetzt werden muss, dass ein Prozess seine eigene Ausgaben verlässlich darstellen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250287</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Thu, 22 Mar 2007 09:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 09:38:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int hCrt;
   FILE *hf;

   hCrt = _open_osfhandle(
             (long) hNamedPipeHandle,
             _O_TEXT
          );
   hf = _fdopen( hCrt, &quot;w&quot; );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1250295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250295</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 22 Mar 2007 09:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 09:39:38 GMT]]></title><description><![CDATA[<p>Und in Deinem Thread darfst Du *keine* CRT Funktionen verwenden! Und schon gar nicht &quot;fflush&quot;!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250296</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 22 Mar 2007 09:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 09:45:48 GMT]]></title><description><![CDATA[<p>Danke, werd ich mal probieren. Warum darf ich in meinem Thread keine CRT-Funktionen aufrufen? Das fflush ist (zumindest bisher) notwendig, sonst wäre die Umleitung witzlos. Ich möchte sofort ausgeben, nicht erst wenn der Puffer voll ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250304</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Thu, 22 Mar 2007 09:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 09:48:11 GMT]]></title><description><![CDATA[<p>Das geht deshalb nicht, da die CRT einen Lock auf den stdout hat. Wenn Du nun auch noch fflush aufrufst, versucht dieser zuerst den stdout zu locken... und dann hast Du einen dead-lock...<br />
Mach das fflush in dem Teil wo Du auch das printf o.ä. machst.</p>
<p>ADD: Und wenn Du</p>
<pre><code class="language-cpp">setvbuf( stdout, NULL, _IONBF, 0 );
</code></pre>
<p>aufrufst, sollte eigentlich das Buffern ausgeschaltet sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250305</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 22 Mar 2007 09:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 10:03:55 GMT]]></title><description><![CDATA[<p>Funktioniert leider nicht, die Pipe bleibt leer.</p>
<pre><code class="language-cpp">mOutPipe = CreateNamedPipe(PIPENAME_OUT, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, 4096, 4096, 500, 0);
if(mOutPipe != INVALID_HANDLE_VALUE)
{
    int hCrt = _open_osfhandle((intptr_t)mOutPipe, _O_TEXT);
    FILE *hf = _fdopen(hCrt, &quot;w&quot;);
    *stdout = *hf;
    setvbuf(stdout, NULL, _IONBF, 0);
}
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1250320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250320</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Thu, 22 Mar 2007 10:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 10:13:21 GMT]]></title><description><![CDATA[<p>Ich habs mal geändert in</p>
<pre><code class="language-cpp">mOutPipe = CreateNamedPipe(PIPENAME_OUT, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1, 4096, 4096, 500, 0);
if(mOutPipe != INVALID_HANDLE_VALUE)
{
    FILE *out = freopen(PIPENAME_OUT, &quot;w&quot;, stdout);
    assert(out);
    setvbuf(out, NULL, _IONBF, 0);
}
</code></pre>
<p>fflush brauche ich so nicht mehr. Das scheint zu funktionieren. Irgendwelche Einwände?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250328</guid><dc:creator><![CDATA[!logged]]></dc:creator><pubDate>Thu, 22 Mar 2007 10:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Umleitung für stdout on Thu, 22 Mar 2007 10:33:24 GMT]]></title><description><![CDATA[<p>Wunderbar... freopen ist sogar besser <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250355</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 22 Mar 2007 10:33:24 GMT</pubDate></item></channel></rss>