Frage

Ich bin eine Art Neuling auf C ++ und arbeite an einem einfachen Programm unter Linux, das ein anderes Programm im selben Verzeichnis aufrufen und die Ausgabe des aufgerufenen Programms erhalten soll, ohne die Ausgabe des aufgerufenen Programms auf der Konsole zu zeigen. Dies ist der Code -Snippet, an dem ich arbeite:

    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;

Eines der Probleme, auf die ich stoße, ist, dass ich die ersten beiden Zeilen auf der Konsole drucken kann, aber ich kann die letzten beiden Zeilen nicht drucken. Ich denke, das Programm funktioniert nicht mehr, wenn ich das Saturoo -Programm aufgerufen habe. Eine andere Sache ist, dass dieser Code zweimal das Satzoo -Programm aufruft. Ich weiß nicht warum? Ich kann die Ausgabe auf dem Bildschirm zweimal sehen. Auf der anderen Seite, wenn ich System () anstelle von execv () verwende, funktioniert der Satzoo nur einmal.

Ich habe nicht herausgefunden, wie ich die Ausgabe von Saturo in meinem Programm lesen soll.

Jede Hilfe wird geschätzt.

Vielen Dank

War es hilfreich?

Lösung

Sie unterscheiden sich nicht zwischen dem Kind und dem übergeordneten Prozess nach dem Anruf an fork(). Also rennen sowohl das Kind als auch der Elternteil execv() und damit ihre jeweiligen Prozessbilder werden ersetzt.

Sie wollen etwas mehr wie:

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");
}

Andere Tipps

Das fork() Funktion kloniert den aktuellen Prozess und kehrt zurück anders Werte in jedem Prozess. Im "Eltern" -Prozess gibt es die PID des Kindes zurück. Im Kinderprozess kehrt es Null zurück. Sie würden es also normalerweise mit einem Modell wie diesem aufrufen:

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

Ich habe im obigen Fehler die Fehlerbehandlung weggelassen.

In Ihrem Beispiel fallen beide oben genannten Codepfade (sowohl über Eltern als auch Kind) in die else Klausel Ihres Anrufs an fork(), was beide dazu führt execv("./Satzoo"). Deshalb läuft Ihr Programm zweimal und Sie erreichen nie die Aussagen darüber.

Anstatt zu verwenden fork() Und alles manuell zu tun (ordnungsgemäß verwaltet die Ausführung der Prozesse ist eine Menge Arbeit), sind Sie möglicherweise daran interessiert, die zu verwenden popen() Funktion stattdessen:

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

Von dem fork() Manpage:

RÜCKGABEWERT
Nach erfolgreicher Fertigstellung kehrt Fork () 0 an den untergeordneten Prozess zurück und gibt die Prozess -ID des untergeordneten Verfahrens an den übergeordneten Prozess zurück. Beide Prozesse müssen weiterhin von der Fork () -Funktion ausgeführt werden. Andernfalls wird -1 an den übergeordneten Prozess zurückgegeben, es darf kein untergeordnetes Verfahren erstellt werden und er ist so eingestellt, dass er den Fehler angibt.

Sie überprüfen, um sicherzustellen, dass es erfolgreich ist, aber nicht, ob die pid Zeigt an, dass wir im Kind oder im Elternteil sind. So tun sowohl das Kind als auch das Elternteil das Gleiche zweimal, was bedeutet, dass Ihr Programm zweimal ausgeführt wird und der Endtext nie gedruckt wird. Sie müssen den Rückgabewert von überprüfen fork() mehr als nur einmal.

EXEC - Die Funktionsfamilie von Exec () ersetzt das aktuelle Prozessbild durch ein neues Prozessbild.

System - Blöcke zur Ausführung des Befehls. Die Ausführung des Anrufprogramms wird fortgesetzt, nachdem der Systembefehl zurückgegeben wird

Es gibt drei Rückgabewerttests, die Sie mit Gabel gewünscht haben

  1. 0: Du bist das Kind
  2. -1: Fehler
  3. Andere: Du bist der Elternteil

Sie haben das andere Programm sowohl vom Kind als auch vom Elternteil ausgeführt ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top