| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		PMedia
 
 
  Anmeldungsdatum: 14.08.2006 Beiträge: 2847
 
  | 
		
			
				 Verfasst am: 12.12.2007, 14: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, 14: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, 15: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, 07: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, 11: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: 17.12.2007, 23: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 | 
		 | 
	
	
		  | 
	
	
		 |