parameter verarbeiten
-
hi! bin gerade dabei meine bescheidenen c kenntnisse etwas aufzufrischen bzw. zu erweitern und habe mal folgende frage:
ich würde gern ein kleines server programm unter linux schreiben das z.b. ähnlich wie der apache mit apache start und apache stop gestartet bzw. gestoppt werden kann. allerdings tu ich mich damit etwas schwer
also der server müsste irgendwie in einer endlosschleife laufen und auf übergabeparameter reagieren (start und stop). desweiteren müsste er nach dem starten wohl einen prozess starten wo ich z.b. den server in den lauschmodus setzen kann usw. ich weiss jetzt nicht so recht wie ich die endlosschleife mit den prozess in einklang bringen kann
hat da jemand mal einen kleinen denkanstoss für mich?
-
du könntest das so machen, dass du bei start einfach den Server daemonisierst (siehe FAQ) und die PID in einer Datei speicherst. Wenn du nun stop aufrufst, liest du einfach die PID und sendest das TERM Signal an den Prozess.
-
ok das werd ich mal probieren
eine sache noch (aus dem faq) 1. fork() aufrufen und den Parent beenden. Dann laeuft nur der Client. unabh. vom parent
ich dachte man kann den parent prozess erst beenden wenn der child prozess beendet ist
-
Dafür ruft man ja 2 Mal fork auf.
Wenn du den Parent beendest bevor der Client ein Parent geworden ist, hast du einen Zombie.
-
achso
ok jetzt hat es klick gemacht.
-
hm jetzt würde mich noch interessieren, wie ich anhand der PID überprüfen kann ob ein prozess existiert, also sowas wie is_process(PID); gibt es da evtl. eine funktion?
-
das ist leider nicht standardisiert. Unter Linux kannst du aber im /proc-Dateisystem nachgucken.
-
danke, das hilft mir schon weiter
-
mm sorry das ich mich nochmal melde, aber irgendwie steh ich grad voll auf dem schlauch. also mein vorhaben war ja folgendes: server programmcode als dämon laufen lassen, dabei die PID irgendwo loggen und beim stoppen wieder einlesen, damit ich den dämon killen kann.
wenn ich den dämon wie folgt aktiviere:
if (daemon(0,0<0)){ perror("daemon()"); exit(1); } openlog("mein_daemon", LOG_PID, LOG_DAEMON); syslog(LOG_NOTICE, "mein_daemon läuft! / PID = %d", LOG_PID); closelog();
der log sieht dann so aus:
May 16 15:01:22 xyz mein_daemon[2553]: mein_daemon läuft! / PID = 1
ok ich nehm mal an, [2553] sollte die PID sein, komisch ist nur das ich diese PID nicht unter /proc oder zb. mit eingabe von ps xj finden kann. LOG_PID gebe ich in syslog einfach nur zur kontrolle aus, aber warum wird da 1 geloggt? das müsste dann ja init sein, der parent meines dämons... oh mann
-
äh, LOG_PID ist keine Prozess-ID sondern eine Konstante für die Funktion openlog().
-
ups ;)und wie komm ich an die PID ran?
-
getpid()
-
getpid() kannte ich noch nicht, ok das funktioniert auch.
mein_daemon[2553]
also lag ich ja mit meiner vermutung richtig, das [2553] die PID ist
so nach eingabe von ps -p 2553 wird trotzdem kein prozess angezeigt. ich nehm das erstmal so hin und schreibe weiter.
-
sprudel schrieb:
hm jetzt würde mich noch interessieren, wie ich anhand der PID überprüfen kann ob ein prozess existiert, also sowas wie is_process(PID); gibt es da evtl. eine funktion?
das kannst du mit kill:
kill( die_pid, 0 );
-
wenn du ein bisschen inspiration vom apache brauchst. Schau dir das mal an:
http://apache.hpi.uni-potsdam.de/
Das solltest du ein pdf finden in welchem genau beschrieben ist wie das alles beim Apache aussieht. Also auch mit den ganzen MPMs.
Auch die Sourcen sind da in einer "browsable" From zu finden.
-
danke für eure tip's!
starten und stoppen des daemons funktioniert jetzt so, wie ich es mir vorgestellt habe