2012-10-05 5 views
1

Donc pour une affectation de classe, nous fabriquons notre propre shell de base. Entre autres fonctions, il doit pouvoir traiter des chemins absolus et exécuter des applications externes en utilisant fork() et execv.Problème avec fork et execve

L'idée est le programme forks un processus fils, appelle execv qui remplace ledit processus enfant, et le termine lorsque l'exécution externe est terminée. Malheureusement, j'ai raté le cours à ce sujet, et j'ai essayé plusieurs exemples que j'ai trouvés en ligne, aucun d'eux n'a fonctionné. Le problème est le processus parent dupliquant la commande execv et se terminant elle-même. En ce moment j'essaye juste de l'obtenir pour exécuter "/ bin/ls" et retourner à la boucle principale du shell.

Voici le code incriminé. J'imagine qu'il me manque quelque chose de simple. Et oui, ce serait une bonne question pour le professeur, mais il ne garde pas les heures de bureau du vendredi et je ne veux pas attendre des heures ou des jours pour une réponse par courriel. : P De même, je sais que je devrais mettre en œuvre une meilleure vérification des erreurs. En ce moment je vais pour la fonctionnalité de base, je vais ajouter les cloches et les sifflets plus tard.

J'ai confirmé que toutes les variables ci-dessous ont leurs propres valeurs. La question est comment puis-je seulement fermer le processus fils après execv et empêcher le parent de faire la même chose? TLDR: Enseigner moi-même comment utiliser fork/execv et trouver que je suis absolument désemparé.

parent
161 pid_t child = fork(); 
162 
163 if(child != -1) 
164 if(token[0] == '.' || token[0] == '/') 
165  if(access(token, X_OK) == 0) { 
166  char** charArgs = toCharMatrix(args); 
167  execv(token, charArgs); 
169  } 
+1

Il faut distinguer entre le parent et l'enfant basé sur le pid retourné par fork. Actuellement, vous dites "si fork n'a pas échoué, exécutez les deux processus". Le processus fils reviendra de fork avec un pid == 0. Vous voulez probablement attendre() dans le parent. – Duck

Répondre

1

doit attendre processus enfant à la fin ... Et afin d'identifier les enfants et les parents, l'utilisation ID de processus retourné par la fourche .. voir un exemple ci-dessous:

int runcmd(char *cmd) 
{ 
    char* argv[MAX_ARGS]; 
    pid_t child_pid; 
    int child_status; 

    parsecmd(cmd,argv); 
    child_pid = fork(); 
    if(child_pid == 0) { 
    /* This is done by the child process. */ 

    execv(argv[0], argv); 

    /* If execv returns, it must have failed. */ 

    printf("Unknown command\n"); 
    exit(0); 
    } 
    else { 
    /* This is run by the parent. Wait for the child 
     to terminate. */ 

    do { 
     pid_t tpid = wait(&child_status); 
     if(tpid != child_pid) process_terminated(tpid); 
    } while(tpid != child_pid); 

    return child_status; 
    } 
} 
+0

Génial! Merci beaucoup, je me suis cogné la tête contre ça pendant plus d'une heure. : P – Scott