Ich muss einen Code für die folgende Option "--command" schreiben.C-Sprachen-Multiprocessing execvp()
die execvp() fehlschlägt, wenn I ausgeführt:
./program --command 1 2 3 cat test.txt
--command IOE cmd args einen Befehl mit Standardeingabe Execute i, standard Ausgabe o und Standardfehler e; Diese Werte sollten früheren Datei- oder Pipe-Optionen entsprechen. Die ausführbare Datei für den Befehl ist cmd und enthält keine Argumente oder Argumente. Keiner der Operanden cmd und args beginnt mit den zwei Zeichen "-".
Der Teil des Codes, der execvp tun muss() ist wie folgt:
if(optarg){
int fd;
int i = 0;
char *arg[20];
int index;
for(index = optind-1; index < argc && *argv[index] != '-'; index++, i++){
switch(i){
case 0:
fd = atoi(argv[index]);
break;
case 1:
fd = atoi(argv[index]);
break;
case 2:
fd = atoi(argv[index]);
break;
default:
arg[i - 3] = (char *)malloc(100 * sizeof(char));
strcpy(arg[i - 3], argv[index]);
}
}
int j;
for(j = 0; j < i - 3; j++)
printf("%s\t", arg[j]);
printf("\n\n");
execvp(*arg, arg);
}
Jede Hilfe sehr geschätzt wird.
Sie erwähnen nicht, was die Art des Fehlers ist, die es schwer macht, Ihnen zu helfen. Die Verwendung von '1 2 3' für in, out und err ist sehr seltsam (stdin ist fd 0, nicht 1), aber da du scheinbar nichts mit tjod-Argumenten verbindest, nehme ich nicht an, dass es verwandt ist. Das Kopieren von Strings und nicht nur das Bereitstellen des korrekten Offsets in das args-Array ist ineffizient und zu kompliziert, aber es könnte funktionieren, wenn Sie das Array korrekt nullterminieren. Wenn Sie darauf bestehen, die Strings zu kopieren, verwenden Sie strlen, um die benötigte Größe herauszufinden (oder rufen Sie einfach strdup statt malloc + strcpy auf). – rici
Vielen Dank Ich benutze jetzt strdup(). Das Problem ist Array-Größe. da ich in meinem test nur zwei argumeny cat test.txt übergebe, so dass der char ** arg nur zwei strings haben muss, während ich 20 (char * arg [20]) deklariert habe. Wie kann ich die Größe von char ** arg dynamisch erhöhen? Ich weiß nicht, wie viele Argumente übergeben werden, also habe ich eine bog-Nummer genommen, aber execvp() ist fehlgeschlagen, weil ich Müll in meinem großen Array hatte. – user3050866
Bitte erstellen Sie ein MCVE ([MCVE]) - es muss nicht viel größer sein als das, was Sie zeigen, aber es muss Ihr Problem reproduzieren und wir müssen in der Lage sein, es zu kompilieren und auszuführen (und das Problem zu sehen). –