Bitte Fehler erklären



  • Also folgendendes, ich wollte mal ein bisschen mit fork() und systemaufrufen spielen.

    #include <unistd.h>
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
        int pid;
    
        cout << getpid() << " gehört Original" << endl;
        pid = fork();
    
        if(pid == 0)
        {
            cout << "Hier Kind, habe PID: " << getpid() << endl;
            //while(1==1)
            {
                cout << "zzz ... HAHAHA" << endl;
            }
    
            cin >> pid;
        }
    
        else
        {
            int a = pid;
            cout << "Hier Vater, Kind hat PID " << pid << "Ich habe immer noch: " << getpid() << endl;
            cout << "Töte Kind:" << endl;
            ostringstream s;
            s << "kill -9 ";
            s << a;
    
            string st( s.str());
            cout << st << endl;
            execvp(st.c_str(), NULL);
        }
        return 0;
    }
    

    ich wollte einfach einen Prozess kopieren, der Original-Prozess soll dann den neuen töten mit kill -9 pid, letztendlich sollte auch der execvp beendet sein nach dem aufruf und das programm schweigen.

    das ganze geschieht aber so nicht, der kinprozess lacht vor sich hin, und ich finde den fehler nicht.
    Das einzige was ich mir denken kann:
    der Elternprozess will das Kind töten, welches noch gar nicht existiert.

    Naja, kann mir das jmd verbessern?



  • Was sagt denn der Rueckgabewert von execv?

    Aus den manpage:

    Das erste Argument dieser Funktionen ist immer der Pfadname der Datei, die ausgeführt werden soll.

    D.h. Du musst den kompletten Pfad des Programms angeben. Ansonsten nutze system, das startet eine shell, die die Namensaufloesung fuer dich uebernimmt. Der Kindprozess sollte nach der Zeile pid = fork() existieren.

    PS: Das ist einfach mal ins Blaue geraten.



  • Wie schon gesagt: execvp ist kein Shell Interpreter, sondern will Pfad und Parameter haben. man: system(3) führt Anweisungen in einer Shell aus. Aber vielleicht willst du ja eher man: kill(2) nehmen.

    Und du solltest bei Funktionen die Fehlschlagen können immer den Erfolg überprüfen und im Notfall die Fehlermeldung ausgeben lassen. Das bringt einen oft weiter

    zB um den Erfolg von fork zu prüfen:

    if(pid == -1) {
      perror("fork");
      return 1;
    }
    


  • Und noch was. Trotz des kill brauchst du immer noch ein wait oder waitpid , AFAIK.


Anmelden zum Antworten