Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 12.12.2007, 15:08 Titel: Programm separat starten |
|
|
jaaaa :]
Einige habens ja sicher mitbekommen, ich code nen Cluster
So ganz einfach ist das aber nicht, ich wüsst gern, wie man GESCHEIT ein Programm als Prozess im Hintergrund startet, meine aktuelle Lösung ist nicht ganz Daemon-Tauglich:
Code: | /' Xi Cluster:
Core Daemon
(c) 2007 PMedia Application Design
Licensed under GPLv2 or later
'/
if command(1) = "start" then
shell "./startxi.sh"
elseif command(1) = "" then
Do
sleep 10
loop until 0
elseif command(1) = "help" then
? "Syntax: cored [OPTION]"
? "Turns this pc into a clusternode of the xi cluster"
?
? " start starts the cored daemon"
? " help shows you this help"
?
? "If you start 'cored' without any parameters, it starts as normal userspace-program"
?
? "Please report bugs to: pmedia@gmx.net"
else
print "Unkown parameter specified"
end if
end |
startxi.sh:
Gibts da unter Linux nich ne saubere Variante?
(Fork zB, da weiß ich aber nicht wie man es macht >_>, aber trotzdem muss der cluster ja auch separat Programme starten können, die als eigener Prozess laufen)
FB lässt da irgendwie nen direkten Befehl vermissen :-/ wahrscheinlich um zu DOS kompatibel zu bleiben, nehm ich mal an. |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 12.12.2007, 15:49 Titel: |
|
|
Das wäre dann eh egal, denn DOS unterstützt schließlich auch kein Multithreading - trotzdem hat FB Unterstützung dafür. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 12.12.2007, 16:39 Titel: |
|
|
Hm gut das stimmt auch wieder... ich hab inzw. mit dem englischen Channel ide API-Calls erarbeitet, mal sehen was draus wird |
|
Nach oben |
|
|
Bimi
Anmeldungsdatum: 03.12.2007 Beiträge: 66
|
Verfasst am: 13.12.2007, 08:41 Titel: |
|
|
Prozesse im Hintergrund im Pseudocode (einfach ins blaue getippt ohne es auszutesten. Das Ergebnis
Code: |
FUNCTION startBackgrounder () AS INTEGER
DIM pid AS INTEGER
' Prozesssplittung
pid = fork ()
' fork has failed
IF pid < 0 THEN RETURN -1
IF pid > 0 THEN
' this is the parent part
RETURN 0
ELSE
' this is the child part
system (_HINTERGRUNDPROGRAMM_)
exit (1)
END IF
END SUB
|
fork erzeugt eine komplette neue Instanz des Prozesses. Im Gegensatz zu dem starten eines Threads, bei dem man den Namen einer Funktion übergibt, welche dan parallel abgearbeitet werden soll, wird bei fork die gesamte Funktionalität geteilt. Hinter fork wird alles von zwei Prozessen durchlaufen und das einzige Unterscheidungskriterium ob man nun im Parent oder im Child ist, ist der Rückgabewert von fork.
Dieser liefer im Parentprozsess die pid des Childprozesses zurück, im Childprozess selbst 0. Somit wird der Else-Zweig vom Child abgearbeitet, der If vom Parent. Das Exit im ELSE sagt das sich der Child nach dem absetzen des System Kommandos beenden soll - würde es fehlen würde auch der Child genauso aus dem startBackgrounder zurückkehren wie der parent.
Drei Fallen:
* google nach "signalhandler setzen" Bei der Verwendung von fork muss das signal SIGCHLD abgefangen werden, sonst gibt es Zombies. SIGCHLD wird vom Child ausgelöst und an den Parent geschickt wenn der Child nen abgang macht und sich vor dem Parent beendet.
* Die Adressräume der beiden sind vollständig getrennt. Im Gegensatz zu Threads gibt es keine gemeinsamen Variablen mehr - die können noch so static oder shared definiert worden sein. Die beiden Prozesse verhalten sich hinter Fork als wären sie zweimla gestartet worden.
* Offene Ressourcen (filepointer) wenn diese vor dem fork geöffnet wurden müssen in beiden geschlossen werden. Versuchen beide über den gleichen Filepointer in eine Datei zu schreiben, so wird das durch das System nicht synchronisiert
google hilft:
- Datenaustausch zwischen den Prozessen über Pipes undShared Memory
- Synchronisation über Signale und Semaphoren
Soll der childprozess auch nach ableben des Parent und auch nach ausloggen des Users als daemon weiterexistieren, muss noch folgendes gemacht werden:
umask(0) 'andere Filemaske setzen
setsid() 'sid setzen
chdir("/") 'auf rootverzeichnis setzen
' die drei Standardfiledescriptoren von der Shell lösen und umleiten
freopen("/dev/null", "r", stdin);
freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr); _________________ Rechtbehelf:
Rechschreibverfehlungen, Vergehen an der Deutschen Sprache sowie Stabwechselverbuchselungen unterliegen dem Urheberrecht, sind voll beabsichtigt und fördern das aufmerksame Lesen. |
|
Nach oben |
|
|
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 17.12.2007, 12:42 Titel: |
|
|
@Bimi: Wo kommt denn nun die funktion "fork ()" her!?!?
Mein Freebasic 0.18 kennt das weder unter linux noch unter windows... |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 18.12.2007, 00:43 Titel: |
|
|
Die kam aus irgendner include... ööh weiß jetz nich, das war glaub ich eine von denen hier:
Code: | #include once "crt/netdb.bi"
#include once "crt/sys/socket.bi"
#include once "crt/netinet/in.bi"
#include once "crt/arpa/inet.bi"
#include once "crt/unistd.bi" |
|
|
Nach oben |
|
|
|