**argv modifizieren; exec-output in file schreiben
-
hallo,
ich habe eine unzip.exe
möchte nun eine unzipv.exe schreiben, die unzip.exe -v **argv aufruft und den output in ein file schreibt.dummerweise komm ich nicht weiter.
meine argv bearbeite ich wie folgt:// variablen deklarieren char **args; int i = 1; // speicher allokieren args = (char**) malloc(2000); // das erste argument args[0] = "unzip.exe"; // argv[0] args[1] = "-v"; // die übrigen argumente for (i; i < argc; i++) { args[i+1] = argv[i]; } // so sieht unser command jetzt aus printf("unzip.exe "); for (i=0; i < argc; i++) { printf("%s ",args[i]); } printf("\n");
... das geht sicher auch einfacher; leider bin ich in c nicht so sattelfest
na ja ... meine redirection ins file hätte ich so aufgebaut:
FILE *stream ; if((stream = freopen("file.txt", "w", stdout)) == NULL) exit(-1); execl("unzip.exe","unzip.exe","-v","Image.zip"); stream = freopen("CON", "w", stdout);
... dazuwischen seht ihr auch schon meinen (im moment noch hardcoded) befehl.
mein problem is nur: der output "verschwindet"; das file ist leer!
kann mir da jemand weiterhelfen?!
danke, guni
-
int main(int argc, char** argv) { char** args = NULL; /* Argumente */ int i = 0; args = malloc(sizeof(char*) * argc + 1); /* kein Cast in C notwendig allokiere anzahl der Argumente*/ for(i = 0; i < argc + 1; ++i) args[i] = malloc (256); /* allokiere Anzahl der Zeilenlänge */ strcpy (args[0], "unzip.exe"); /* unzip ... */ strcpy (args[1], "-v"); /* und -v */ for(i = 2; i < argc + 1; ++i) /** restliche Argumente übernehmen **/ strcpy(args[i],argv[i - 1]); for(i = 0; i < argc + 1; i++) printf("Args[ %d ]: %s\n", i, args[i]); /*** Speicher freigeben ***/ for(i = 0; i < argc + 1; ++i) free(args[i]); free(args); return 0; }
Für dass Problem mit der Ausgabe kannst du dir Pipes anschauen...
Gruß
tobi--- Edit: return 0 vergessen ---
-
beliebter Fehler bei exec* Funktionen: zu vergessen, die Liste der Paratemter mit NULL abzuschließen. Wie soll execl wissen, welches das letzte Argument ist?
-
das mit dem NULL übergeben versteh ich jetzt nicht ganz. wenn ich 5 argumente hab, dann ist wohl einfach das 5te argument das letzte, oder?
1. wieso kein return 0?
2. ich weiß schon, dass es mit pipes gehen würde, mein problem is, der aufruf selbst ist schon definiert! ich kann den aufruf der update.exe nicht beeinflussen; deswegen schreib ich ja den "wrapper"
-
guni schrieb:
das mit dem NULL übergeben versteh ich jetzt nicht ganz. wenn ich 5 argumente hab, dann ist wohl einfach das 5te argument das letzte, oder?
was ist denn so schwer zu verstehen, dass das letzte Element stets NULL sein soll?
execl("unzip.exe","unzip.exe","-v","Image.zip", NULL);
man: execl(3) ist eine Ellipse, die zur Laufzeit bestimmen soll, wie viele Argumente übergeben wurden. Das geht nur, wenn das letzte Element NULL ist.
-
ja. ok. nehm ich mal so hin.
und was is mit dem output? weiß da noch wer weiter?lg, guni
-
hilfe! ich komm nicht mehr weiter!
-
was genau willst du jetzt?
-
ich will das, was mein befehl normalerweise am screen ausgibt in C(!!) "abfangen" und in eine Datei schreiben!
-
das ist OS-abhängig. Unter Unix machst du das mit pipes. Wie es unter Windows geht, weiß ich nicht. Muss im richtigen Unterforum fragen oder um Verschiebung bitten.
-
Also Redirecting funktioniert unter Windows natürlich mit "prog > output.txt". Aber das ist so simpel, daß du es bestimmt schon probiert hast. Eine andere Möglichkeit wäre das hier zu versuchen.
freopen("file.txt","w",stdout);
Damit fängst du die meisten Meldungen ab, z.B. von printf und co.
EDIT:
fclose(stdout);
dann aber nicht vergessen!
-
hallo,
danke für eure hilfreichen beiträge bisher. bin gerade noch auf ein anderes problem gestroßen und zwar startet mir ein einfaches execl nicht mehrere programme:
int main(int argc, char **argv) { execl("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE",NULL); execl("C:\\WINDOWS\\SYSTEM32\\MSHEART.EXE",NULL); execl("C:\\WINDOWS\\SYSTEM32\\MSPAINT.EXE",NULL); return 0; }
wieso wird immer nur das erste programm gestartet; bzw. wie kann ich sagen, dass mehrere programme gestartet werden sollen?!
lg, guni
-
Execl kommt nicht zurück, wenn ich mich nicht irre. Du müsstest dafür vorher einen eigenen Thread machen.