Christian Seiler: / Sonstiges: Programm aus C++ aufrufen

Beitrag lesen

Hi,

Bei spawn gibt es AFAIK schon mal zumindest diese Möglichkeiten. [...]

Lauter ähnliche Funktionen aufzuführen, ohne den Unterschied zu erklären, halte ich für wenig sinnvoll. Daher mal eine Erklärung (gilt analog zu exec*(), die Suffixe sind dieselben):

* Präfix:

(keines)   Akzeptiert (char *) als Parameter und damit Strings in
                 der aktuellen 8bit-Kodierung des Systems
      _w         Akzeptiert (wchar_t *) als Parameter und damit Strings
                 in UTF-16/UCS-2 bzw. dem gewurschtel, was der C-Standard
                 traurigerweise mit wchar_t angestellt hat.

* Suffix:

- Parameterübergabe:

l     Übergib die Argumente als variable Parameterzahl, nach
                 dem letzten Argument folgt NULL als weiterer Parameter, um
                 die Liste abzuschließen. »l« steht für »list«
           v     Übergib die Argumente als Array, das letzte Argument im
                 Array wird von NULL gefolgt, um das Ende zu markieren.
                 »v« steht für »vector«.

Beachte: Das "nullte" Argument muss trotzdem immer noch der
        Programmname sein, auch wenn man den irgendwie schon einmal vorher
        übergeben hat (als Parameter unmittelbar vor der Argumentliste).

- Umgebungsvariablen:

(nichts)   Vererbe die Umgebungsvariablen des eigenen Prozesses.
           e          Übergib eigene Umgebungsvariablen als Array von
                      Strings, ein NULL kennzeichnet das Ende des Arrays.
                      »e« steht für »environment«. Die Strings haben den
                      Inhalt "VARIABLE=wert", Format ist identisch zum
                      globalen environ-Array bzw. zum optional dritten
                      Parameter der main()-Funktion.

- Suchpfad

(nichts)   Erwarte für den Pfad-Parameter einen relativen oder
                      absoluten Pfad.
           p          Wenn der Pfad-Parameter kein expliziter Pfad ist,
                      d.h. keinen Pfadtrenner (/ unter POSIX, \ unter
                      Windows) enthält, dann suche im Suchpfad danach, d.h.
                      in der Umgebungsvariable PATH oder in deren Default-
                      wert, sofern die nicht vorhanden ist.

Beispiele für letzten Punkt:

spawnlp(_P_WAIT, "notepad", "notepad", "C:\\test.txt", NULL);
       -> funktioniert, findet notepad
  spawnl(_P_WAIT, "notepad", "notepad", "C:\\test.txt", NULL);
       -> funktioniert nicht, da eine Datei "notepad" im aktuellen
          Verzeichnis nicht existiert
  ~~~c spawnlp(_P_WAIT, "C:\Windows\notepad.exe", "notepad", "C:\test.txt", NULL);
  spawnl(_P_WAIT, "C:\Windows\notepad.exe", "notepad", "C:\test.txt", NULL);

       -> kein Unterschied  
  
Beispiel für die v-Funktionen:  
  
~~~c
char *args[] = {  
 "notepad",  
 "C:\\test.txt",  
 NULL  
};  
spawnv(_P_WAIT, "C:\\Windows\\notepad.exe", args);

Beispiele für die e-Funktionen:

char *args[] = {  
 "notepad",  
 "C:\\test.txt",  
 NULL  
};  
char *env[] = {  
 "FOO=bar",  
 "BAZ=blub",  
 NULL  
};  
spawnve(_P_WAIT, "C:\\Windows\\notepad.exe", args, env);

Viele Grüße,
Christian