Question

Salut je travaille sur un shell unix et je suis en cours d'exécution en deux problèmes. Je me demandais si quelqu'un d'entre vous pourrait me aider. Mon premier problème est que la coquille n'attend pas le processus de l'enfant de mettre fin. Je peux effectivement aller taper plusieurs commandes alors que le processus de l'enfant est en cours d'exécution. Mon deuxième problème est dans les deux lignes suivantes. Je ne reçois pas tout affichage sur la coque.

    fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
    fprintf(stderr, "Child pid = %d\n", pid);

I ai la méthode suivante pour exécuter un processus saisie par l'utilisateur: à savoir firefox, ls -a, etc

void execute(char *command[], char *file, int descriptor){
    pid_t pid;
    pid = fork();

    if(pid == -1){
        printf("error in execute has occurred\n");
    }
    if(pid == 0){           
        execvp(*command,command);
        fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
        fprintf(stderr, "Child pid = %d\n", pid);
        wait(&status);
            exit(EXIT_SUCCESS);
    }
    else{
        printf("ignore for now\n");
    }
}

est où j'appelle la commande exécuter. Il fonctionne très bien et lance un processus, mais il ne l'attend pas à la fin.

 execute(commandArgv, "STANDARD",0);

Avez-vous les gars ont une idée de ce que je pourrais faire mal? Merci j'apprécie vraiment chaque fois que vous prenez pour me aider à ce sujet.

Était-ce utile?

La solution

Une fois execvp () fonctionne, il ne reviendra jamais. Il remplace en mémoire l'application en cours d'exécution avec tout ce qui était prévu. Ainsi, votre fprintf () et attendre () sont au mauvais endroit.

Autres conseils

Autre que d'obtenir la logique réelle a fonctionné correctement (les suggestions de Stéphane tout bon), vous pouvez également fflush (stderr) après fprintf-ing, pour vous assurer que vos messages d'erreur font tout de suite au lieu d'être en mémoire tampon.

Vous avez une petite erreur dans la façon dont fonctionne le processus. Après execvp est appelé, il n'y a pas de retour en arrière. fork () vous donne que le parent et un enfant identique, mais execvp image enfant Ecraser être la commande que vous appelez.

Les execvp retourne uniquement lorsqu'une erreur grave se produisent qui empêchent écraser l'image. , Vous avez besoin d'imprimer des choses avant son appel. Ainsi, vous pouvez également modifier le EXIT_SUCCESS EXIT_FAILURE il.

Maintenant, il y a une autre erreur en utilisant attendez : vous voulez toujours le parent en attente de l'enfant, et non l'inverse. Vous ne pouvez pas demander à l'enfant d'attendre. Elle n'a rien à attendre, elle se déroulera et se terminer. Donc, vous devez déplacer le wait () appeler à autre partie.

void execute(char *command[], char *file, int descriptor)
{
    pid_t pid;
    pid = fork();

    if(pid == -1)
    {
        printf("fork() error in execute() has occurred\n");
        return; /* return here without running the next else statement*/
    }
    if(pid == 0)
    {           
        fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
        fprintf(stderr, "Child pid = %d\n", getpid());
        execvp(*command,command);
        fprintf(stderr, "Error! Can't overwrite child's image!\n");
        exit(EXIT_FAILURE);
    }
    else
    {
        printf("Parent waiting for child pid: %d\n", pid);
        wait(&status);
        printf("Parent running again\n");
    }
}

Mais la lecture de votre question, peut-être que vous ne voulez pas vraiment le parent d'attendre. Si tel est le cas, il suffit de ne pas utiliser le wait () fonction .

Faites attention, Beco

Sous la direction: quelques erreurs mineures. pid de l'enfant est getpid ()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top