2017-01-15 13 views
0

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.

+1

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

+0

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

+1

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). –

Antwort

0

Hier ist eine Funktion, die ich schrieb und eine Menge verwendet, die hilfreich sein kann; geschrieben in C++ und das Ziel-Betriebssystem ist Linux; Sie können den Code für C überprüfen und anpassen:

#define MAX_PARMS 100 //crazy 
#define MAX_PARM_SIZE 5120 //make it 5K ///max is command-line-max (4096) i think too lazy to check 
#define SPACE_CHAR 32 
bool is_valid_space(const std::string s, int pos) 
{ 
    if (s[pos]!=SPACE_CHAR) return false; 
    if (!pos) return true; 
    if (s[pos-1]=='\\') return false; 
    return true; 
} 
void RunApp(const std::string sApp, const std::string sParm) 
{ 
    if (!isextant(sApp)) return; 
    int n=0,i=0; 
    while (i < (int)sParm.length()) { if (is_valid_space(sParm, i)) n++; i++; } 
    if ((n>=(MAX_PARMS-1)) || ((sApp.length() + sParm.length() + 1) > MAX_PARM_SIZE)) return; 
    pid_t pID = fork(); 
    if (pID == 0) 
    { //child.. 
     if (sParm.length()!=0) 
     { 
      static char *arsz[MAX_PARMS]; //pointers to offsets in sz[]-buffer 
      static char sz[MAX_PARM_SIZE]; 
      int p=1,t=0,i=0,n; 
      n = sApp.length(); //copy app into sz[] as first parm 
      while (i<n) { sz[i]=sApp.at(i); i++; } 
      sz[i] = 0; 
      t = i+1; 
      arsz[0] = sz; 
      n = sParm.length(); 
      i=0; 
      while (i<n) 
      { 
       if (is_valid_space(sParm, i)) i++; 
       if ((i<n) && (!is_valid_space(sParm, i))) 
       { 
        arsz[p] = sz+t; p++; 
        while ((i<n) && (!is_valid_space(sParm, i))) 
        { 
         sz[t]=sParm.at(i); 
         t++; 
         i++; 
        } 
        sz[t]=0; t++; 
       } 
      } 
      sz[t]=0; //double null at end 
      execvp(sApp.c_str(), arsz); 
     } //NB: here-be-zombies: must waitpid in caller 
     else execlp(sApp.c_str(), sApp.c_str(), (char*)0); 
     exit(0); //only if exec..-error 
    } 
} 
+0

OP-Code ist C und Ihr Code verwendet C++ –

Verwandte Themen