<?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[Problem bei übergabe von char *array[] &#x2F; execvp aufruf]]></title><description><![CDATA[<p>Hallo liebe Community <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> ,<br />
Ich möchte eine (UNIX) Shell schreiben, welche einen neuen Prozess erzeugt und und mittels execvp(command,parameters) ausführt.<br />
Für mein eigentliches Problem habe ich den Code(unten) gekürzt.</p>
<p>Für die Übergabe an execvp habe ich,wie unten zu sehen,ein char Array command und ein Zeiger auf ein char Array parameters angelegt.</p>
<p>In der Funktion read_command(...) habe ich eine Testausgabe geschrieben, welche wie erwartet ausgegeben werden.<br />
Nach aufruf von read_command(...) bekomme ich command angezeigt, die parameter, welche oben Funktioniert haben leider nicht.</p>
<p>Sicher gibt es insgesammt auch eine bessere möglichkeit die Zeile(wholeLine) zu zerlegen und in command bzw parameters[] zu speichern, welche ich leider nicht gefunden habe <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=":confused:"
      alt="😕"
    /></p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

#define MAXLINE 100

void read_command(char *command, char *parameters[]) { // prompt for user input and read a command line

    std::string wholeLine;
    std::string comm;
    std::string params[30]; // 30 just for Test
    std::string tmpString;
    std::getline(std::cin, wholeLine);
    char tmpCString[MAXLINE];

    std::stringstream ss(wholeLine);

    ss&gt;&gt;command; // First Word in command

    int i=0;
    while(ss.good())
    {
        ss&gt;&gt;tmpString;
        //ss&gt;&gt;parameters[i];
        strncpy(tmpCString,tmpString.c_str(), sizeof(tmpCString));
        tmpCString[sizeof(tmpCString)-1]=0; // Nullterminieren sicherheitshalber
        params[i++]=tmpCString;

    }

    for (int x =0; x&lt;i; x++) {
        std::string tmpS;
        tmpS=params[x];

        strncpy(tmpCString, tmpS.c_str(), sizeof(tmpCString));
        tmpCString[sizeof(tmpCString)-1]=0; // Nulterminieren
        parameters[x]=tmpCString;
        std::cout &lt;&lt;&quot;test in read_command &quot;&lt;&lt;x&lt;&lt;&quot; &quot;&lt;&lt;parameters[x]&lt;&lt;std::endl; // Testausgabe Funktioniert an dieser Stelle noch
    }

} // read_command

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

    char command[MAXLINE];
    char *parameters[MAXLINE];

    read_command(command, parameters); // read user input

        std::cout&lt;&lt;&quot;Command: &quot;&lt;&lt;command&lt;&lt;std::endl;     // Ausgabe von command funktioniert wie erwartet
        std::cout&lt;&lt;&quot;param1 &quot;&lt;&lt;parameters[0]&lt;&lt;std::endl; // Ausgabe von parameters[0]und parameters[1] funktioniert leider nicht.  
        std::cout&lt;&lt;&quot;param2 &quot;&lt;&lt;parameters[1]&lt;&lt;std::endl;

        return (0); 
}
</code></pre>
<p>Nach Start der Programms und eingabe von &quot;befehl foo bar&quot; erscheint folgende ausgabe in der Konsole:<br />
&quot;befehl foo bar<br />
test in read_command 0 foo<br />
test in read_command 1 bar<br />
Command: befehl<br />
param1<br />
param2 &quot;</p>
<p>Nach param1 sollte eigentlich &quot;foo&quot; und nach param2 &quot;bar&quot; stehen, wie es oben auch funktionierte.</p>
<p>Ich hoffe ihr versteht mein Problem und könnt mir Hilfe diesbezüglich geben.<br />
Danke schonmal für eure Mühe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332314/problem-bei-übergabe-von-char-array-execvp-aufruf</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 03:47:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332314.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 21 Apr 2015 17:34:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Sun, 26 Apr 2015 19:31:31 GMT]]></title><description><![CDATA[<p>Hallo liebe Community <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> ,<br />
Ich möchte eine (UNIX) Shell schreiben, welche einen neuen Prozess erzeugt und und mittels execvp(command,parameters) ausführt.<br />
Für mein eigentliches Problem habe ich den Code(unten) gekürzt.</p>
<p>Für die Übergabe an execvp habe ich,wie unten zu sehen,ein char Array command und ein Zeiger auf ein char Array parameters angelegt.</p>
<p>In der Funktion read_command(...) habe ich eine Testausgabe geschrieben, welche wie erwartet ausgegeben werden.<br />
Nach aufruf von read_command(...) bekomme ich command angezeigt, die parameter, welche oben Funktioniert haben leider nicht.</p>
<p>Sicher gibt es insgesammt auch eine bessere möglichkeit die Zeile(wholeLine) zu zerlegen und in command bzw parameters[] zu speichern, welche ich leider nicht gefunden habe <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=":confused:"
      alt="😕"
    /></p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

#define MAXLINE 100

void read_command(char *command, char *parameters[]) { // prompt for user input and read a command line

    std::string wholeLine;
    std::string comm;
    std::string params[30]; // 30 just for Test
    std::string tmpString;
    std::getline(std::cin, wholeLine);
    char tmpCString[MAXLINE];

    std::stringstream ss(wholeLine);

    ss&gt;&gt;command; // First Word in command

    int i=0;
    while(ss.good())
    {
        ss&gt;&gt;tmpString;
        //ss&gt;&gt;parameters[i];
        strncpy(tmpCString,tmpString.c_str(), sizeof(tmpCString));
        tmpCString[sizeof(tmpCString)-1]=0; // Nullterminieren sicherheitshalber
        params[i++]=tmpCString;

    }

    for (int x =0; x&lt;i; x++) {
        std::string tmpS;
        tmpS=params[x];

        strncpy(tmpCString, tmpS.c_str(), sizeof(tmpCString));
        tmpCString[sizeof(tmpCString)-1]=0; // Nulterminieren
        parameters[x]=tmpCString;
        std::cout &lt;&lt;&quot;test in read_command &quot;&lt;&lt;x&lt;&lt;&quot; &quot;&lt;&lt;parameters[x]&lt;&lt;std::endl; // Testausgabe Funktioniert an dieser Stelle noch
    }

} // read_command

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

    char command[MAXLINE];
    char *parameters[MAXLINE];

    read_command(command, parameters); // read user input

        std::cout&lt;&lt;&quot;Command: &quot;&lt;&lt;command&lt;&lt;std::endl;     // Ausgabe von command funktioniert wie erwartet
        std::cout&lt;&lt;&quot;param1 &quot;&lt;&lt;parameters[0]&lt;&lt;std::endl; // Ausgabe von parameters[0]und parameters[1] funktioniert leider nicht.  
        std::cout&lt;&lt;&quot;param2 &quot;&lt;&lt;parameters[1]&lt;&lt;std::endl;

        return (0); 
}
</code></pre>
<p>Nach Start der Programms und eingabe von &quot;befehl foo bar&quot; erscheint folgende ausgabe in der Konsole:<br />
&quot;befehl foo bar<br />
test in read_command 0 foo<br />
test in read_command 1 bar<br />
Command: befehl<br />
param1<br />
param2 &quot;</p>
<p>Nach param1 sollte eigentlich &quot;foo&quot; und nach param2 &quot;bar&quot; stehen, wie es oben auch funktionierte.</p>
<p>Ich hoffe ihr versteht mein Problem und könnt mir Hilfe diesbezüglich geben.<br />
Danke schonmal für eure Mühe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451101</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Sun, 26 Apr 2015 19:31:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 18:07:42 GMT]]></title><description><![CDATA[<p><div class="plugin-markdown"><input type="checkbox" id="checkbox70444" checked="true" /><label for="checkbox70444">auf Speicherleichen zu).</label></div></p>
<p>Da du sowieso schon teilweise die C++ Datentypen verwendest, schreib deine Funktion um zu:</p>
<pre><code class="language-cpp">void read_command(string &amp;command, vector&lt;string&gt; &amp;parameters)
</code></pre>
<p>PS: Das C-Äquivalent wäre übrigens:</p>
<pre><code>char parameters[MAXPARAMETERS][MAXLINE]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2451108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451108</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 21 Apr 2015 18:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 18:26:14 GMT]]></title><description><![CDATA[<p>Hallo und danke für deine schnelle Antwort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Klar! Die Variable tmpCString ist nur in der Funktion gültig, das habe ich wohl nicht beachtet.</p>
<p>Wie du es vorgeschlagen hast(mit einem Vector), hätte ich meine Funktion eigentlich auch geschrieben, nur ist mir der aufruf von execvp(...) anschließend nicht möglich oder ?</p>
<p>Verstehe ich das richtig:<br />
char *parameters[MAXLINE] ist eine misxhung von c++ und c und sollte so nicht genutzt werden ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451110</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Tue, 21 Apr 2015 18:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 18:32:25 GMT]]></title><description><![CDATA[<p>DaJon_ schrieb:</p>
<blockquote>
<p>Wie du es vorgeschlagen hast(mit einem Vector), hätte ich meine Funktion eigentlich auch geschrieben, nur ist mir der aufruf von execvp(...) anschließend nicht möglich oder ?</p>
</blockquote>
<p>Wieso nicht? Aus einen std::string kann man doch leicht einen C-String machen.</p>
<blockquote>
<p>Verstehe ich das richtig:<br />
char *parameters[MAXLINE] ist eine misxhung von c++ und c und sollte so nicht genutzt werden ?</p>
</blockquote>
<p>Nein, diese Zeile selbst ist einfach typisches C. In C++ würde man das nie so machen. Der Rest deines Programms ist aber (teilweise) C++. Daher ist dein Gesamtprogramm eine Mischung aus C und C++. C und C++ arbeiten aber nicht sonderlich gut zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451114</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 21 Apr 2015 18:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 18:39:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Wieso nicht? Aus einen std::string kann man doch leicht einen C-String machen.</p>
</blockquote>
<p>Ja, nur muss ich aus einem Vector ein 2 Dim. C Array machen, wenn ich das richtig verstehe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451121</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Tue, 21 Apr 2015 18:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 18:49:54 GMT]]></title><description><![CDATA[<p>DaJon_ schrieb:</p>
<blockquote>
<blockquote>
<p>Wieso nicht? Aus einen std::string kann man doch leicht einen C-String machen.</p>
</blockquote>
<p>Ja, nur muss ich aus einem Vector ein 2 Dim. C Array machen, wenn ich das richtig verstehe?</p>
</blockquote>
<p>Welche Version von execvp willst du denn einsetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451123</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 21 Apr 2015 18:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 19:20:53 GMT]]></title><description><![CDATA[<p>Ehrlich gesagt kenne ich nur eine Version:</p>
<pre><code>int execvp(const char *file, char *const argv[]);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2451128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451128</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Tue, 21 Apr 2015 19:20:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 19:45:08 GMT]]></title><description><![CDATA[<p>Dann würde ich vor dem Aufruf einen <code>vector&lt;const char*&gt;</code> erstellen, diesen mit den <code>c_str()</code> s aus dem <code>vector&lt;string&gt;</code> füllen und dann einen Zeiger auf das erste Element (also <code>data()</code> ) an execvp übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451131</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 21 Apr 2015 19:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 19:51:37 GMT]]></title><description><![CDATA[<p>Das klingt gut vielen dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Nur weiss ich nicht, wie ich einen Zeiger auf das erste Element übergebe und was du mit data() meinst ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451135</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Tue, 21 Apr 2015 19:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Tue, 21 Apr 2015 20:15:09 GMT]]></title><description><![CDATA[<p>DaJon_ schrieb:</p>
<blockquote>
<p>Das klingt gut vielen dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Nur weiss ich nicht, wie ich einen Zeiger auf das erste Element übergebe und was du mit data() meinst ?</p>
</blockquote>
<p>Na, entweder <code>&amp;mein_vector[0]</code> oder eben <code>mein_vector.data()</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451137</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 21 Apr 2015 20:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Wed, 22 Apr 2015 12:24:50 GMT]]></title><description><![CDATA[<p>Ah danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Leider funktioniert mein execvp Aufruf noch nicht:</p>
<p>&quot;No matching function for to call 'execvp'&quot;</p>
<pre><code>int status;
std::vector&lt;const char *&gt; params;
const char* comm = command.c_str();
// Füllen des Vectors, fork() etc. 
status = execvp(comm,params.data());
</code></pre>
<p>Habe mir execvp nochmal angeschaut:</p>
<pre><code>int execvp(const char *, char * const *);
</code></pre>
<p>warum kann ich die Funktion nicht aufrufen ? <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451198</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Wed, 22 Apr 2015 12:24:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Wed, 22 Apr 2015 12:43:13 GMT]]></title><description><![CDATA[<p>Hier mal ein Beispiel: <a href="http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp" rel="nofollow">http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp</a></p>
<p>Eventuell musst du deinem Compiler mitteilen das er C++11 oder neuer verarbeiten soll.</p>
<p>Ältere C++11 Compiler erfordern bei Strings in einigen Fällen die C-Variante. Mit C++11 werden Strings mehr im C++ Stil unterstützt.</p>
<p>MfG f.-th.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451200</guid><dc:creator><![CDATA[f.-th.]]></dc:creator><pubDate>Wed, 22 Apr 2015 12:43:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Wed, 22 Apr 2015 13:02:33 GMT]]></title><description><![CDATA[<p>Was genau hat das mit älteren oder neueren C++11-Compilern zu tun?</p>
<p>@OP:</p>
<p>Das Problem ist, dass execvp ein char * const * (Zeiger auf konstante Zeiger auf Char) erwartet, Du ihm aber ein char const * (const) * (Zeiger auf Zeiger auf konstante Char) gibst. Der Vector muss ein vector&lt;char*&gt; sein (das zunächst mal unabhängig von der Sprachversion).</p>
<p>Da aber string::c_str einen Zeiger auf const liefert, musst Du hier hässlicherweise das const wegcasten, sonst geht es nicht. Das ist an dieser Stelle aber sauber, da wir &quot;wissen&quot;, dass execvp die Strings nicht verändert.</p>
<p>Hint: &amp;command[0], um einen nicht-konstanten Zeiger auf den String zu bekommen, ist nicht ratsam, da der String dann nicht zwingenderweise nullterminiert sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451202</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 22 Apr 2015 13:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Wed, 22 Apr 2015 13:45:06 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Da aber string::c_str einen Zeiger auf const liefert, musst Du hier hässlicherweise das const wegcasten, sonst geht es nicht. Das ist an dieser Stelle aber sauber, da wir &quot;wissen&quot;, dass execvp die Strings nicht verändert.</p>
</blockquote>
<p>So hat es geklappt. vielen lieben Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451205</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Wed, 22 Apr 2015 13:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Thu, 23 Apr 2015 09:39:31 GMT]]></title><description><![CDATA[<p>Nachdem der Aufruf funktioniert hat, habe ich leider ein weiteres Problem.<br />
Der Vector wird scheinbar nicht richtig übergeben..</p>
<pre><code>// ...
int status;
std::string command;
std::vector&lt;const char *&gt; params;
// command und params wird gefüllt...

// Testausgabe
for (int i=0; i&lt;params.size(); i++) {
     std::cout&lt;&lt;&quot;params in Kind an stelle &quot;&lt;&lt;i&lt;&quot; &quot;&lt;&lt;&lt;params[i]&lt;&lt;std::endl;
     }

std::cout&lt;&lt;&quot;Command in Kind : &quot;&lt;&lt;command&lt;&lt;std::endl

status= execvp(const_cast&lt;char*&gt;(command.c_str()),const_cast&lt;char**&gt;(params.data())); // hier das Problem ?
</code></pre>
<p>Nach eingabe von &quot;echo test&quot; erscheint folgende Ausgabe:<br />
&quot;params in Kind an stelle 0 test<br />
Command in Kind : echo<br />
// leerzeile<br />
&quot;</p>
<p>Der echo Befehl wird also ausgeführt, sonst wäre keine leerzeile vorhanden, allerdings verschluckt er das erste Argument.</p>
<p>Wenn ich allerdings &quot;echo test1 test2&quot; eingebe erscheint folgende Ausgabe:<br />
&quot;params in Kind an stelle 0test1<br />
params in Kind an stelle 1test2<br />
Command in Kind : echo<br />
test2&quot;</p>
<p>Hier wird also der echo Befehl ausgeführt, allerdings nur mit dem 2.Parameter und der Erste wird wieder verschlungen.</p>
<p>Jemand eine Idee woran das liegen könnte ?<br />
LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451320</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Thu, 23 Apr 2015 09:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Thu, 23 Apr 2015 09:45:37 GMT]]></title><description><![CDATA[<p>man execvp schrieb:</p>
<blockquote>
<p>The execv(), execvp(), and execvpe() functions provide an array of pointers to null-terminated strings that represent the argument list available to the new program. <strong>The first argument, by convention, should point to the filename associated with the file being executed.</strong> The array of pointers must be terminated by a NULL pointer.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2451322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451322</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 23 Apr 2015 09:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Sun, 26 Apr 2015 11:53:49 GMT]]></title><description><![CDATA[<p>Soo bin wieder ein Stück weiter doch hänge erneut an einem Problem:</p>
<pre><code>//...
std::vector&lt;char*&gt; params;
while(1){
// Füllen von params etc.
// params.push_back(NULL); // Bei Ausführen dieses Befehls erscheint gar keine Ausgabe 

// Testausgabe
for (int i=0; i&lt;params.size(); i++) {
     std::cout&lt;&lt;&quot;params in Kind an stelle &quot;&lt;&lt;i&lt;&quot; &quot;&lt;&lt;&lt;params[i]&lt;&lt;std::endl;
     }

status= execvp(const_cast&lt;char*&gt;(params[0]),const_cast&lt;char**&gt;(&amp;params.front())); 
//...
params.clear();
}// ende while-Schleife
</code></pre>
<p>Bei eingabe von &quot;echo test1 test2&quot;:<br />
&quot;<br />
params in Kind an stelle 0 echo<br />
params in Kind an stelle 1 test1<br />
params in Kind an stelle 2 test2<br />
test1 test2&quot;</p>
<p>-Also genauso wie ich es erwartet habe.</p>
<p>Gebe ich anschließend &quot;echo test3&quot; ein erscheint folgende Ausgabe:<br />
&quot;<br />
params in Kind an stelle 0 echo<br />
params in Kind an stelle 1 test3<br />
test3 test2&quot;</p>
<p>-Der vector params hat wie erwartet nur 2 Stellen. Trotzdem wird mir der 2. Parameter vom Durchlauf davor mit ausgegeben.<br />
Meine Vermutung:Der compiler(?) weiß also nicht, wo er aufhören soll die Argumente auszulesen, die trotz des params.clear() befehl noch im Speicher vorhanden sind ?</p>
<p>Das anfügen von NULL (wie oben auskommentiert) führt allerdings dazu, dass gar keine Ausgabe erscheint, was mich verwundert <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=":confused:"
      alt="😕"
    /></p>
<p>Ich hoffe ihr könnt mir weiterhelfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /><br />
LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451593</guid><dc:creator><![CDATA[DaJon_]]></dc:creator><pubDate>Sun, 26 Apr 2015 11:53:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei übergabe von char *array[] &#x2F; execvp aufruf on Mon, 27 Apr 2015 06:03:47 GMT]]></title><description><![CDATA[<p>Leider sieht man an Deinem Code nicht, <strong>wann</strong> Du NULL in den Vector pusht. Jedenfalls sieht man in der Ausgabe nichts davon, dass am Ende des Vectors noch ein Element mit dem Inhalt NULL vorhanden ist.</p>
<p>Tipp für die Korrektur: NULL nach cout zu schreiben ist undefined, Du müsstest also dort etwas wie</p>
<pre><code class="language-cpp">std::cout &lt;&lt; (params[i] != NULL ? params[i] : &quot;NULL&quot;)&quot;
</code></pre>
<p>machen.</p>
<p>Und benutze nullptr <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/2451643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451643</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 27 Apr 2015 06:03:47 GMT</pubDate></item></channel></rss>