2017-07-01 1 views
-2

Je rencontre un problème avec la fonction fork utilisée dans une fonction que j'utilise pour créer un terminal pour un projet d'école.Echec de la fourchette dans C

Cette fonction est appelée à gérer l'entrée utilisateur quand ils tapent dans une commande:

void handleExternalCommands(char ** arr) 
{ 
    pid_t pid; 

    pid = fork(); 

    printf("pid is ", (long) pid); 

    if (pid == -1) 
    { 
     perror("fork"); 
     exit(EXIT_FAILURE); 
    } 
    else if (pid == 0) 
    { 
     int status = execvp(arr[0], arr); 

     printf("im in the child process"); 

     if (status == -1) 
     { 
      // error handle 
     } 

    } 

    wait(); 
} 

Cependant, peu importe ce que je tape, je ne peux pas réellement faire à l'intérieur de l'instruction if. Si j'essaie de savoir ce qui se passe avec pid en utilisant:

printf(pid); 

Je reçois une erreur de segmentation fault?

Merci pour votre aide à l'avance, tout le monde.

MISE À JOUR:

J'ai changé le code à ce qu'il est au-dessus. L'impression du pid ne se produit qu'une seule fois et il n'imprime rien: "pid is"

+0

Si la fourche est défaillante, vous pouvez facilement déterminer pourquoi. 'if (pid == -1) perror (" fork ");' –

+0

'printf (pid)' n'imprime pas 'pid', sauf si 'pid' est une chaîne sans caractères de formatage. Lisez la documentation de 'printf()'. – Peter

+0

Si 'execvp()' fonctionne, 'printf()' n'est jamais exécuté. Vous ne verrez que le message de 'printf()' si (a) vous avez ajouté un saut de ligne à la fin et (b) le 'execvp()' a échoué. (OK: vous pourriez le voir même sans nouvelle ligne, mais le saut de ligne est une bonne idée.) Déplacez 'printf()' avant le 'execvp()' et (définitivement) ajoutez le retour à la ligne et vous devriez voir les informations . –

Répondre

2

Si le execvp() fonctionne, le printf() n'est jamais exécuté. Vous ne verriez le message que de printf() si (a) vous avez ajouté un saut de ligne à la fin et (b) que le execvp() a échoué. (OK: vous pourriez le voir éventuellement même sans un saut de ligne, mais le saut de ligne est une bonne idée.)

Déplacez le printf() avant le execvp() et (définitivement) ajoutez la nouvelle ligne et vous devriez voir l'information. Voir aussi printf() anomaly after fork(), mais notez que vous avez une autre conséquence de ne pas terminer la sortie printf() avec des sauts de ligne. En cas de panne, vous devez lire le manuel sur printf() et ajouter des options du compilateur pour vous informer d'une utilisation erronée.

Vous avez probablement besoin:

printf("PID %d\n", pid); 

Cela suppose que pid_t est suffisamment compatible avec int ne pas avoir des ennuis - une hypothèse modérément sûre, mais qui peut être évité en écrivant:

printf("PID %d\n", (int)pid); 

(ou utiliser int pid; comme définition). Mais le point clé est que vous devez utiliser printf() correctement, et execvp() ne retourne pas, sauf s'il échoue.

+0

Génial. Merci pour cette réponse concise. Je pense que je réalise mes erreurs maintenant, et mes problèmes sont spécifiques à la mise en œuvre de mon programme et non parce que fork échoue.Merci pour ton aide. – JPG

+1

Bien que 'fork()' puisse échouer, il est relativement rare. Généralement, supposez que le problème est dans votre propre code, pas dans le système - vous aurez plus souvent raison que vous aurez tort. (Même si 'fork()' échoue, le plus souvent, c'est à cause d'un problème dans votre programme, pas d'une défaillance du système.) –