2017-09-13 1 views
0

Ich versuche, ein Programm zu schreiben, das fork, dann eine Datei öffnen und ausführen. Die Datei, die es ausführen soll, heißt Kind und wurde kompiliert. Wenn ich ./child tippe, läuft es. Wenn ich dieses Programm ausführe, wird das untergeordnete Programm jedoch nicht ausgeführt und ich werde mit der Fehlermeldung "Ausführung fehlgeschlagen" aufgefordert. Was mache ich falsch?Kann execvp nicht ausführen Datei

Das ist meine Elternklasse

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/wait.h> 



int main (int argc, char **argv) 
{ 

pid_t parent = getpid(); 
pid_t pid = fork(); 


if (pid == -1) 
{ 
// error, failed to fork() 
} 
else if (pid > 0) 
{ 
int status; 
waitpid(pid, &status, 0); 
} 
else 
{ 

int var = execvp("./child", NULL); 

if(var < 0) 
{ 
    printf("Execution failed"); 
} 

} 
exit(0); // exec never returns 
} 

Dies ist das Kind

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main (int argc, char **argv) 
{ 
printf ("Im the child"); 
exit (0); 
} 
+2

1. Lesen Sie die Dokumentation sorgfältig durch. 2. Ausdruck "errno" und wenn möglich 'strerror (errno)', was sagt es? 3. Warum sollte './Child' an' execvp() 'übergeben werden? 3. Was sollte der zweite Parameter sein? 4. Hast du die Dokumentation gelesen? Ich glaube nicht, dass du das getan hast, weil du wissen würdest, was der zweite Parameter sein sollte. Nimm nicht schlecht, aber lies bitte die Dokumentation, bevor du fragst. –

+1

Es kann verbessert werden (eine Menge Warnungen vom Compiler für das Haupt ...), aber für mich funktioniert der Code. –

+0

Kannst du einen Grund finden, warum es nicht für mich funktioniert? Das untergeordnete Programm wird nie ausgeführt. – Rubiks

Antwort

1

ich eigentlich gar nicht wissen, was Sie falsch machen. Nach einer Kopie und einer Kompilierung (und einigen Warnhinweisen) läuft Ihr Code gut (GCC 7.2).

Natürlich muss Kind in dem gleichen Arbeitsverzeichnis sein, in dem Sie Ihre Haupt-ausführbare Datei ausführen (die, die Gabeln).

Aber wahrscheinlich würde ich diesen Code auf diese Weise schreiben, aber ich bin kein Experte in Forking:

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <errno.h> 

extern int errno; 

int main() { 
    pid_t pid = fork(); 

    if (pid < 0) { 
    fprintf(stderr, "%s\n", strerror(errno)); 
    return 1; 
    } 

    if (pid == 0) { 
    int ret = execl("./child", "", (char *)NULL); 
    if(ret < 0) { 
    fprintf(stderr, "%s\n", strerror(errno)); 
    return 1; 
    } 
    } else { 
    wait(NULL); 
    } 
    return 0; 
} 

Mindestens es Ihnen sagt, welche Fehler execl aufgetreten.

Verwandte Themen