2017-12-06 41 views
0

Ich arbeite an einem Nebenprojekt, wo ich 5 Kinderprozesse spawnen will dann execvp in ein zweites Programm namens isEven, die sagen wird, ob die Zahl, die an sie übergeben wird, gerade ist oder nicht. Der Aufruf von execvp schlägt jedoch fehl, da ich ihn in gdb ausgeführt habe und er nicht ausgeführt wird. Args und Load (Args) werden beide in einer anderen Funktion aufgerufen.c Programmierung mit execvp

Vielen Dank im Voraus !!!

//Code to load binary 
void load(char* args[]) 
{ 
    execvp("./isEven", args); 
    printf("ERROR\n"); 
} 

//args being passed in 
char *args[] = {"./isEven", number, NULL}; 
load(args); 

Hier ist ein kleineres Programm, das ich geschrieben habe, das das gleiche tut, was ich gerade versuche zu tun. Gdb sagt, ich bekomme einen Segmentierungsfehler.

int main(int argc, char *argv[]) 
{ 
    int returnCode = fork(); 

    if(returnCode == 0) 
    { 
     char *args[] = {"./isEven", 12345, NULL}; 
     execvp("./isEven", args); 
     printf(errno); 
     printf("ERROR: execvp failed\n"); 
     exit(-1); 
    } 
    else if(returnCode < 0) 
    { 
     fprintf(stderr, "fork failed\n"); 
    } 
    else 
    { 
     //i am the parent 
     printf("I am the parent"); 
    } 
    return 1; 
} 
+1

Was ist 'Nummer'? Wo ist der Rest des Programms? (Wenn der Rest des Programms zu groß ist, verkleinern Sie es und sehen Sie, ob das Problem weiterhin auftritt. [Mcve]) – Ryan

+1

execvp setzt 'errno' wenn es fehlschlägt. – tkausl

+0

Ich schrieb ein schnelles Programm, nur um zu testen, ob ich execvp arbeiten kann, aber gdb gibt mir einen seg-Fehler. – Steven

Antwort

2

Das Hauptproblem ist, mit dieser Linie:

char *args[] = {"./isEven", 12345, NULL}; 

Die args zu execvp geben muss ein Array von char* sein. Wenn Sie 12345 als Argument verwenden, wird es als Adresse interpretiert und es ist unwahrscheinlich, dass es eine gültige Adresse ist. In jedem Fall wollten Sie das nicht. So tun:

char *args[] = {"./isEven", "12345", NULL}; 

Sie müssen number in eine Zeichenfolge konvertieren. Zum Beispiel:

int number = 12345; 
char num_str[256]; 
snprintf(num_str, sizeof num_str, "%d", number); 
char *args[] = {"./isEven", num_str, NULL}; 
execvp("./isEven", args); 
perror("exec"); 

In Ihrem modifizierten Beispiel drucken Sie errno als:

printf(errno); 

Dies wird fehlschlagen, da printf einen String als erstes Argument erwartet. Sie können perror() verwenden, um den Fehler wie oben gezeigt zu drucken.

+0

Ich verbrachte den ganzen Tag versucht, herauszufinden, warum es nicht funktionierte ... – Steven

+0

Eine Million danke !!!! – Steven