<?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[fork()-Problem beim öffnen des vi-Editors aus einem C++-Programm heraus]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe zwar schon den einen oder anderen Hinweis hierzu gefunden, so richtig weitergeholfen hat es mir aber leider nicht.<br />
Daher beschreibe ich mein Problem hier einfach mal.</p>
<p>Ich versuche gerade, unter Linux aus einem C++-Programm den vim-Editor zu öffnen (was ansatzweise auch schon klappt).<br />
Aber irgendwie scheint die Geschichte mit dem fork() noch nicht ganz zu funktionieren. Mein Problem ist folgendes:</p>
<p>Ich starte das Programm und übergebe den Namen der zu öffnenden Datei als Parameter.<br />
Der Editor öffnet sich (unten steht also so was wie &quot; &quot;testdatei.txt&quot; [New File] &quot; aber sobald ich irgendeine Taste drücke, z.B. 'i' um in den Insert-Mode zu gelangen, erhalte ich die Meldung</p>
<blockquote>
<p>Vim: Error reading input, exiting...</p>
<p>Vim: Finished.</p>
</blockquote>
<p>Anschließend finde ich mich auf der Shell wieder und darf das Terminal resetten...</p>
<p>Hier erst einmal der Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;unistd.h&gt;
using namespace std;

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

	int ret;
	char filename[50];

	cout &lt;&lt; &quot;Anzahl Argumente: &quot; &lt;&lt; argc &lt;&lt; endl;

	if(argc == 2)
	{	strcpy(filename, argv[1]);
		cout &lt;&lt; &quot;Oeffne Datei: &quot; &lt;&lt; filename &lt;&lt; endl;

		cpid = fork();

		if(cpid == 0)
		{
			cout &lt;&lt; &quot;Child PID: &quot; &lt;&lt; cpid &lt;&lt; endl;
			ret = execl (&quot;/usr/bin/vim&quot;, &quot;vi&quot;, filename, (char *)0);

			exit(255); 
		}
	}
	else
	{
		cout &lt;&lt; &quot;Syntax: ./[Programmname] [Dateiname]&quot; &lt;&lt; endl;
	}

	cout &lt;&lt; &quot;Programmende!&quot; &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Lasse ich dagegen den fork()-Teil weg, öffnet sich der Editor, ich kann etwas eingeben, speichern und gut.<br />
Allerdings beendet sich das aufrufende Programm damit auch, was jedoch nicht beabsichtigt ist.</p>
<p>Vom Ablauf her soll es eigentlich so aussehen, dass das Programm eine Art Wrapper um den vi(m) bildet.<br />
Nachdem also der Editor geschlossen wurde, soll das Programm noch ein paar weitere Aktionen ausführen, bis es beendet wird.</p>
<p>Vielen Dank schon mal vorab!</p>
<p>Gruß,<br />
kyusho</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268571/fork-problem-beim-öffnen-des-vi-editors-aus-einem-c-programm-heraus</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 15:12:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268571.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Jun 2010 07:24:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to fork()-Problem beim öffnen des vi-Editors aus einem C++-Programm heraus on Fri, 11 Jun 2010 07:24:08 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe zwar schon den einen oder anderen Hinweis hierzu gefunden, so richtig weitergeholfen hat es mir aber leider nicht.<br />
Daher beschreibe ich mein Problem hier einfach mal.</p>
<p>Ich versuche gerade, unter Linux aus einem C++-Programm den vim-Editor zu öffnen (was ansatzweise auch schon klappt).<br />
Aber irgendwie scheint die Geschichte mit dem fork() noch nicht ganz zu funktionieren. Mein Problem ist folgendes:</p>
<p>Ich starte das Programm und übergebe den Namen der zu öffnenden Datei als Parameter.<br />
Der Editor öffnet sich (unten steht also so was wie &quot; &quot;testdatei.txt&quot; [New File] &quot; aber sobald ich irgendeine Taste drücke, z.B. 'i' um in den Insert-Mode zu gelangen, erhalte ich die Meldung</p>
<blockquote>
<p>Vim: Error reading input, exiting...</p>
<p>Vim: Finished.</p>
</blockquote>
<p>Anschließend finde ich mich auf der Shell wieder und darf das Terminal resetten...</p>
<p>Hier erst einmal der Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;unistd.h&gt;
using namespace std;

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

	int ret;
	char filename[50];

	cout &lt;&lt; &quot;Anzahl Argumente: &quot; &lt;&lt; argc &lt;&lt; endl;

	if(argc == 2)
	{	strcpy(filename, argv[1]);
		cout &lt;&lt; &quot;Oeffne Datei: &quot; &lt;&lt; filename &lt;&lt; endl;

		cpid = fork();

		if(cpid == 0)
		{
			cout &lt;&lt; &quot;Child PID: &quot; &lt;&lt; cpid &lt;&lt; endl;
			ret = execl (&quot;/usr/bin/vim&quot;, &quot;vi&quot;, filename, (char *)0);

			exit(255); 
		}
	}
	else
	{
		cout &lt;&lt; &quot;Syntax: ./[Programmname] [Dateiname]&quot; &lt;&lt; endl;
	}

	cout &lt;&lt; &quot;Programmende!&quot; &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Lasse ich dagegen den fork()-Teil weg, öffnet sich der Editor, ich kann etwas eingeben, speichern und gut.<br />
Allerdings beendet sich das aufrufende Programm damit auch, was jedoch nicht beabsichtigt ist.</p>
<p>Vom Ablauf her soll es eigentlich so aussehen, dass das Programm eine Art Wrapper um den vi(m) bildet.<br />
Nachdem also der Editor geschlossen wurde, soll das Programm noch ein paar weitere Aktionen ausführen, bis es beendet wird.</p>
<p>Vielen Dank schon mal vorab!</p>
<p>Gruß,<br />
kyusho</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910429</guid><dc:creator><![CDATA[kyusho]]></dc:creator><pubDate>Fri, 11 Jun 2010 07:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to fork()-Problem beim öffnen des vi-Editors aus einem C++-Programm heraus on Fri, 11 Jun 2010 07:38:14 GMT]]></title><description><![CDATA[<p>Vermute einfach mal daran das der vim versucht std::cin zu lesen (ist ja schließlich ein Konsolenprogramm) und daran scheitert, da dies an dein Programm gebunden ist. Du musst vim wohl in einer neuen Terminal-Session starten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910432</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 11 Jun 2010 07:38:14 GMT</pubDate></item><item><title><![CDATA[Reply to fork()-Problem beim öffnen des vi-Editors aus einem C++-Programm heraus on Fri, 11 Jun 2010 08:23:26 GMT]]></title><description><![CDATA[<blockquote>
<p>Du musst vim wohl in einer neuen Terminal-Session starten.</p>
</blockquote>
<p>Hmm, das kann ich mir irgendwie nicht vorstellen.<br />
Ich hatte (allerdings vor Jahren) mal ein Projekt gesehen, das ähnliche Funktionalität aufwies und bei welchem der Editor in der gleichen Shell/Terminal-Session geöffnet und geschlossen wurde.</p>
<p>Und, wie schon gesagt, ohne das fork() klappt es ja auch in der gleichen Shell.<br />
Irgendwie muss es dann ja scheinbar gehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910474</guid><dc:creator><![CDATA[kyusho]]></dc:creator><pubDate>Fri, 11 Jun 2010 08:23:26 GMT</pubDate></item><item><title><![CDATA[Reply to fork()-Problem beim öffnen des vi-Editors aus einem C++-Programm heraus on Fri, 11 Jun 2010 08:26:12 GMT]]></title><description><![CDATA[<p>Ohne das fork wartet dein Programm ja auch und nutzt std::cin nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910477</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 11 Jun 2010 08:26:12 GMT</pubDate></item><item><title><![CDATA[Reply to fork()-Problem beim öffnen des vi-Editors aus einem C++-Programm heraus on Mon, 14 Jun 2010 11:15:36 GMT]]></title><description><![CDATA[<p>Hmm, also nach langem googlen und diversen Versuchen mit pipe(), fork() und popen() verzweifele ich nun langsam.</p>
<p>Jedesmal wenn ich das Ganze anhand irgendwelcher simplen Beispiel-Programme nachvollziehen konnte (viele davon in der Art eines Aufrufs von &quot;ls *&quot; aus einem C++-Programm heraus) und es dann wieder mit meinem vi-Aufruf versuche, geht's in die Hose... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>Mal heißt es:</p>
<blockquote>
<p>Vim: Warning: Output is not to a terminal</p>
</blockquote>
<p>, dann wieder</p>
<blockquote>
<p>Vim: Warning: Input is not from a terminal</p>
</blockquote>
<p>.</p>
<p>Aber ich denke, eigentlich müsste ich doch auf dem richtigen Weg sein, oder?<br />
Für mein Verständnis müsste es doch eigentlich wie folgt ablaufen:</p>
<p>- Programmstart mit der zu öffnenden Datei als Parameter.<br />
- Anlegen einer Pipe zwischen Programm und vim-Editor.<br />
- Kind-Prozess erzeugen und die Ein- und Ausgaben zwischen Programm und vim-Editor (Aufruf per execl()) über die Pipe abwickeln.<br />
- Datei im vim-Editor speichern und diesen beenden, wobei das C++-Programm noch weiterläuft und ein paar weitere Aufgaben durchführt.<br />
- Programmende</p>
<p>Alternativ dazu habe ich ein paar Beispiele mit popen() gefunden. Leider funktionieren diese auch nur mit dem &quot;ls&quot;-Befehl oder ähnlich simplen Dingen.<br />
Versucht man, den vi irgendwie darüber anzusprechen, geht's wieder in die Hose...</p>
<p>Kann ja sein, dass ich auf dem absoluten Holzweg bin aber wie sollte es sonst gehen?<br />
Wie müsste ich es z.B. anfangen, wenn ich den vi in einer neuen Terminal-Session starten würde?</p>
<p>Hat vielleicht jemand 'nen Tip?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912070</guid><dc:creator><![CDATA[kyusho]]></dc:creator><pubDate>Mon, 14 Jun 2010 11:15:36 GMT</pubDate></item></channel></rss>