Question

Je suis un peu novice en C ++, et de travailler sur un programme simple sur Linux qui est censé appeler un autre programme dans le même répertoire et obtenir la sortie du programme appelé sans montrer la sortie du programme invoqué sur la console. Ceci est l'extrait de code que je travaille sur:

    pid_t pid;
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
    //int i=system("./Satzoo");
    if(pid=fork()<0)
        cout<<"Process could not be created..."<<endl;
    else
    {
        cout<<pid<<endl;
        execv("./Satzoo",NULL);
    }
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;

L'un des problèmes que je rencontre est que je suis capable d'imprimer les deux premières lignes sur la console mais je ne peux pas imprimer les deux dernières lignes. Je pense que le programme cesse de fonctionner quand j'appeler le programme Satzoo. Une autre chose est que ce code appelle deux fois le programme Satzoo, je ne sais pas pourquoi? Je peux voir la sortie à l'écran deux fois. D'autre part, si j'utilise le système () au lieu de execv (), le Satzoo ne fonctionne qu'une fois.

Je n'ai pas compris comment lire la sortie de Satzoo dans mon programme.

Toute aide est appréciée.

Merci

Était-ce utile?

La solution

Vous n'êtes pas distinguisng entre l'enfant et le processus parent après l'appel à fork(). Ainsi, l'enfant et la course mère execv() et donc leurs images respectives processus sont remplacés.

Vous voulez quelque chose comme:

pid_t pid;
printf("before fork\n");

if((pid = fork()) < 0)
{
  printf("an error occurred while forking\n");
}
else if(pid == 0)
{
  /* this is the child */
  printf("the child's pid is: %d\n", getpid());
  execv("./Satzoo",NULL);
  printf("if this line is printed then execv failed\n");
}
else
{
  /* this is the parent */
  printf("parent continues execution\n");
}

Autres conseils

La fonction fork() clone le processus en cours et retourne différentes valeurs dans chaque processus. Dans le processus de « parent », il retourne le pid de l'enfant. Dans le processus de l'enfant, il retourne zéro. Donc, vous appeler normalement à l'aide d'un modèle comme celui-ci:

if (fork() > 0) {
    cout << "in parent" << endl;
} else {
    cout << "in child" << endl;
    exit(0);
}

J'ai erreur omis dans le traitement ci-dessus.

Dans votre exemple, les deux chemins de code ci-dessus (les deux parents et enfants) entrent dans la clause else de votre appel à fork(), ce qui provoque tous les deux à execv("./Satzoo"). Voilà pourquoi votre programme se déroule deux fois, et pourquoi vous jamais atteindre les déclarations au-delà.

Au lieu d'utiliser fork() et tout faire manuellement (correctement gérer l'exécution des processus est une bonne quantité de travail), vous pourriez être intéressé à utiliser la fonction de la place popen():

FILE *in = popen("./Satzoo", "r");
// use "in" like a normal stdio FILE to read the output of Satzoo
pclose(in);

De la fork() manpage:

  

VALEUR DE RETOUR   Après avoir réussi, fork () retourne 0 au processus de l'enfant et renvoie l'ID de processus du processus enfant au processus parent. Les deux processus doivent continuer à exécuter à partir de la fonction fork (). Dans le cas contraire, -1 est retourné au processus parent, aucun processus fils est créé, et errno doit être réglé pour indiquer l'erreur.

Vous vérifiez pour vous assurer qu'il réussit, mais pas si le pid indique que nous sommes dans l'enfant ou le parent. Ainsi, l'enfant et le parent font la même chose deux fois, ce qui signifie que votre programme est exécuté deux fois et le texte de fin est jamais imprimé. Vous devez vérifier la valeur de retour de fork() plus d'une fois.

exec - La famille des fonctions exec () remplace l'image de processus en cours avec une nouvelle image de processus

. Système

- blocs sur l'exécution de la commande. L'exécution du programme d'appel se poursuit après la commande retourne système

Il y a trois tests de valeur de retour que vous voulez avec une fourchette

  1. 0: vous êtes l'enfant
  2. -1: erreur
  3. autre: vous êtes le parent

Nous avons exécuté l'autre programme à la fois l'enfant et le parent ...

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