PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Cross Platform Daemon



AlphaWolf
16-03-2006, 23:37
ch arbeite weiterhin an meinem cross Platform Konsolen-Programm. Das ganze ist sogar mein erstes richtiges C++ Programm überhaupt (war bisher nur dreckiger php script0r^^). Ein paar Grundfunktionen habe ich eingebaut und das ganze läuft schon sowohl unter Windows (einfach mit VS compilen) und auch unter linux auf meinem v-server mithilfe des gnuc Compilers. Wenn das Projekt größer wird müsste ich mir dann auch mal make anschauen aber ich schieb das vor mir her^^

Das ganze wird ein Daemon, soll also im Hintergrund laufen und nur zu bestimmten Zeiten aktiv werden und was ausführen (das Programm ist per lua scriptbar). Einige Sachen frage ich mich (sowohl für win als auch für linux).

1. Wie mache ich unter Win und auch unter Linux, dass das Ding in den Hintergrund geht und sich da ruhig verhällt?^^ Reicht es bei Linux einfach im Startscript die Ausgabe an /dev/null weiterzuleiten? Aber wie bei Win?

2. Wie mache ich das mit dem Startscript? Muss ich in mein Programm für Linux was einbauen (mit *.pid Files und so). Weil dann muss ich schon wieder was anpassen. Will die üblichen Sachen start) stop) restart) reload). Reload liest dan halt die die lua Scripts neu ein.

3) Wie bekomme ich unter Linux die Systemzeit raus? Ich denke da muss ich wieder was verzweigen also unter Linux andere Header einbauen, oder?

7.e.Q
17-03-2006, 07:22
... shit ... wie war denn das noch... ging das unter Windows respektive DOS nicht irgendwie so:

befehl > NULL

??? Oh Gott, ist das lange her...

zu 3) die Systemzeit bekommst du mit der Funktion gettimeofday()... mal nach googln oder die manpage fragen! Ist'n Systemcall. Das Equivalent unter Windows heißt getsystemtime() bzw. um die lokale Zeit abzufragen (in Abhängigkeit zur eingestellten Zeitzone) getlocaltime(). Google und MSDN sind deine Freunde.

SeeksTheMoon
17-03-2006, 07:29
1. Entweder Du schreibst es richtig als daemon, so dass das Programm einmal forkt und der parent sich beendet oder Du benutzt einen Superserver wie (x)inetd oder Du machst einfach ein Startscript mit nohup & und Umlenkung nach /dev/null.
Windows - ka

2. Du musst nichts mit pid einbauen, wenn sich Dein Programm vernünftig beenden lässt, ansonsten braucht man eine pid-Datei um mit dem kill-Kommando arbeiten zu können.
Die Distributionen machen leider recht unterschiedliche initscripte; vergleiche es einfach mit einem schon bestehenden.

3. Die normale Uhrzeit? In C einfach mit dem time-Header, ansonsten kannst Du aus Scripten auch das date-Kommando benutzen

AlphaWolf
17-03-2006, 16:00
Ich werde es wohl einfach erstmal mit dem Umleiten machen.

Das mit den Startscript raff ich nicht so ganz (hab nicht so viel Ahnung von der Shell). Vor allen Dingen wie ich z.B dem Prozess dann sagen soll, dass er sich beenden soll bzw. reloaden soll. Starten ist klar (krieg ich irgendwie hin), aber wie kann ich von außen irgendwas dadrin triggern z.b stopen oder beenden etc.?

Hab mal das Startscript von meinem apache2 angehängt. Ist einfach die neuste Version aus den offiziellen apt Quellen.

Edit: Achja und noch was. Wenn ich das Programm jetzt weiter gebe kann ich da irgendwie die libraries vorkompiliert so mitgeben, dass sich die nicht jeder selber installieren muss. Ich benutze auch Curl, was zwar jetzt nicht so exotisch ist, aber ich werde eventuell auch noch andere Sachen einbauen. Kann ich die *.so Datei einfach mit in den ausgelieferten Ordner stecken und fertig?

Sascha Bahl
25-03-2006, 12:58
Hallo Alphawolf!

Wenn Du unter GNU/Linux einen Daemon schreiben willst, dann tue das bitte auch. Alles andere sind halbe Sachen. Wie du das tust ist wirklich sehr gut in dem Buch Linux-Unix Programmierung beschrieben. Auch als Open-Book einsehbar:

http://www.pronix.de/pronix-21.html

Ich habe mir das Buch vor einiger Zeit gekauft und nie bereut.

Wenn Du deinen Daemon geschrieben hast, kannst Du ihn einfach starten. Der Anfangsprozess wird ein Kind-Prozess starten. Das Kind wird daraufhin seinen Elternprozess killen und selbst zum Daemon werden. Auch wenn es sich brutal anhört. Es ist eine einfache saubere Angelegenheit.

Der Daemon selbst kann, weil es keine Konsole besitzt, beispielsweise über den Syslog-Daemon in ein Logfile schreiben. So kannst Du kontrollieren was er macht.

Wenn Du es doch etwas einfacher magst, kannst Du jedes Programm unter Linux starten und in den Hintergrund schicken, indem Du einfach das &-Zeichen anhängst: meinprogramm&