2016-12-28 5 views
0

Ich habe ein kleines Problem mit dem Execve-Befehl. Das Programm Test sollte zwei untergeordnete Elemente erstellen, und jedes Programm sollte eine ausführbare Datei ausführen, um ein anderes Programm zu laden und auszuführen. Aber ich bekomme eine schlechte Adresse auf der Exekutive.Execve gibt eine schlechte Adresse

char* argv[]={"Test", "Test_1", "NULL"}; 

"NULL" ist ein Zeichenfolgenliteral, es ist nicht dasselbe wie NULL: Der Code ist wie folgt: richtig

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <time.h> 
#include <sys/ipc.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(){ 
    int child_1, child_2; 

    child_1=fork(); 
    if(child_1==0){ 
     char* argv[]={"Test", "Test_1", "NULL"}; 
     if((execve("Test_1", argv, NULL))<0) perror("execve 1 fail"); 
     exit(0); 
    }else if(child_1<0)perror("error fork"); 
    else wait(NULL); 

    child_2=fork(); 
    if(child_2==0){ 
     char* argv1[]={"Test", "Test_2", "NULL"}; 
     if((execve("Test_2", argv1, NULL))<0) perror("execve 2 fail"); 
     exit(0); 
    }else if(child_2<0)perror("error fork"); 
    else wait(NULL); 
return 0; 
} 
+0

Es wird kein Fehler * per se * verursacht, aber es ist verdächtig, dass Sie 'wait()' für das erste Kind vor dem Forken des zweiten warten. Wenn die beiden Kinder nacheinander ausgeführt werden sollen, ist das nur der richtige Weg, aber wenn sie gleichzeitig ausgeführt werden sollen, sollte der Elternteil nicht warten, bis er beide Kinder gegabelt hat. –

+0

Danke für den Tipp. Es sollte gleichzeitig funktionieren, also werde ich versuchen, was Sie vorgeschlagen haben. – Leo

Antwort

4

Sie sind nicht das Argument Array beendet wird. Das Array muss mit einem Nullzeiger beendet werden. Stattdessen:

char* argv[]={"Test", "Test_1", (char*)0}; 

In ähnlicher Weise beheben Sie das andere Argument Array.

+0

Danke für die schnelle Antwort, jetzt funktioniert es. – Leo

+0

Gern geschehen! –