anderes prog starten



  • ich möchte aus meinem programm ein anderes starten z.B. den Apache Deamon.
    Das wär mit system() ja noch einfach, aber ich möchte auch prüfen können ob der Apache schon läuft, aber nicht indem ich prüfe ob der port 80 abgehört wird, denn es kann auch jedes andere programm sein!

    d.h. befor ich das prog starte, muss ich wissen, ob dieses schon läuft, und auch befor ich es beende.

    wie mach ich das?



  • Original erstellt von matti83:
    [...] wie mach ich das?

    Würde sagen mit einem Startscript, welches alle benötigten Prozesse startet
    (und falls nötig auch kontrolliert ob der Prozess noch läuft).



  • ich möchte das aber aus meinem programm herraus machen, weil ich diesen dienst dann über http anbieten möchte!!!



  • Ist das hier vieleicht das falsche FORUM für dieses Thema?

    Wenn JA dann bitte ich doch einen der Administratoren meine Frage in ein anderes Forum zu stellen!

    (Hauptsache ich find das dann noch wieder.)

    [ Dieser Beitrag wurde am 04.04.2003 um 22:34 Uhr von matti83 editiert. ]



  • du kannst ja die Ausgabe von ps aux nach dem Apache durchsuchen

    (BTW. wenn du ein Programm starten möchtest ist system totaler Overhead, siehe auch C++ FAQ! Nimm lieber execve oder die exec* Funktionen)



  • SOOO LEUTE JETZT HAB ICH ES !!!!!!

    So gehts:

    int main()
    {
       // Ich erzeuge zwei gleiche processe dieses programmes
       pid_t pid = fork();
       // jetzt prüf ich welcher process ich bin
       switch( pid){
         case 0:  // bei 0 bin ich der Childprocess
             // hier starte ich das andere programm
             execl( "prog", "param", (char*) 0);  
             break;
         case -1:  // bei -1 ist was falschgelaufen und ich beende! 
             return -1; 
         default:  // ansonsten bin ich der Parentprocess
             break;
       }
       // da ich in meinem code bis hier gekommen bin,
       // muss ich der Parentprocess sein, und kann jetzt
       // die ProcessID des Childprocesses aus pid lesen.
       printf("ChildprocessID: %i\n", pid);
       return 0;
    }
    

    Jenachdem was ich jetzt moch machen möchte, kann ich das im Parent weiter schreiben.
    Ich danke euch für die HILFE 😉



  • Gut das du so gewissenhaft den fork()-Aufruf mit einem switch prüfst, aber so ein execl() geht eher mal schief, so dass ein return mit entsprechender Fehlermeldung vielleicht besser als ein break wäre.

    Ausserdem hat die Lösung nicht viel mit der ursprünglichen Frage zu tun, aber trotzdem schön das du dein Problem gelöst hast 😉

    [ Dieser Beitrag wurde am 06.04.2003 um 00:52 Uhr von DrGreenthumb editiert. ]



  • wenn du mir eine bessere lösung sagen kannst, wär ich die sehr verbunden. 😃



  • öhm.. ich meine nicht das deine Lösung schlecht ist, sondern das sie nicht die Lösung für die Frage im ersten Posting ist 😉



  • Nun prinzipiel trifft es das aber. ich kann nur nicht vor dem start feststellen, ob das prog schon läuft.



  • vorher überprüfen ob Pid-File vorhanden ist ??, kugelt bei Suse unter /var/run/httpd.pid rum wenn mich nicht alles taeuscht.
    Was natuerlich voraussetzt das der Apache vorher nicht unsauber beendet wurde ...

    sers
    Baboo

    [ Dieser Beitrag wurde am 08.04.2003 um 08:26 Uhr von Baboom editiert. ]



  • Original erstellt von Baboom:
    **
    Was natuerlich voraussetzt das der Apache vorher nicht unsauber beendet wurde ...
    **

    Das ist nicht wichtig, da man ohne Probleme herausbekommen kann ob die Pid noch läuft und ob sie zu Apache gehört. Auf jeden Fall solange man das ProcFs auf seiner Maschine hat.

    Prinzipiell braucht man vor man das pid file auch nicht es geht halt nur schneller als wenn man das ganze Proc durchwühlt.

    Joe


Anmelden zum Antworten