007
01.02.2009, 00:30 Uhr
0xdeadbeef
Gott (Operator)
|
std::system spawnt eine Shell und führt darin aus, was immer man als Parameter mitgibt. Unter Windows kann man auf die Art, wenn der Dateityp mit einer Anwendung verbunden ist, Dateien "ausführen." Zum Beispiel
C++: |
#include <cstdlib>
// ...
std::system("C:\foo.mp3");
|
...wenn cfoo.mp3 eine MP3-Datei ist. Dabei gilt Shell-Syntax, unter Umständen wirst du den Kram also in \"\" einschließen müssen.
ABER:
Es gelten die üblichen Probleme bei der Verwendung von std::system oder anderer, vergleichbarer Techniken. Siehe dazu www.fun-soft.de/showtopic.php?threadid=9346
Generell empfiehlt sich die Benutzung von Bibliotheken statt Prozessen, wenn es um Programmlogik geht (wenn du etwa in Versuchung kommst, etwas wie system("cls"); zu machen, empfiehlt sich je nach Plattform die Ausgabe von \x1b[2J; oder die Verwendung von clrscr(); aus dem DOS-conio-API). Sollte aber die Verwendung eines anderen Programms unabkömmlich sein, ist eine fork-exec-Kombination deutlich besser als system, etwa
C++: |
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h>
#include <iostream>
int main() { pid_t pid; int status;
pid = fork();
if(pid == 0) { // Führt "ls -l -a" aus execlp("ls", "ls", "-l", "-a", NULL); } else { std::cout << "child pid: " << pid << std::endl; waitpid(pid, &status, 0); } }
|
...hier hast du mehr Kontrolle darüber, was ausgeführt wird und was damit passiert. Zum Beispiel lassen sich die Ein- und Ausgabeströme so umbiegen, dass die Ausgabe des Kindprozesses vom Vaterprozess gelesen werden können, etwa so:
C++: |
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h>
#include <iostream> #include <string>
int main() { pid_t pid; int status; int pipes[2];
pipe(pipes); pid = fork();
if(pid == -1) { std::cerr << "Fehler beim Forken!"; } else if(pid == 0) { close(STDOUT_FILENO); dup(pipes[1]); close(pipes[0]);
execlp("ls", "ls", "-l", "-a", NULL); } else { std::string s;
close(STDIN_FILENO); dup(pipes[0]); close(pipes[1]);
std::cout << "child pid: " << pid << std::endl;
while(std::getline(std::cin, s)) { std::cout << "Received from child: " << s << std::endl; }
waitpid(pid, &status, 0); } }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |