Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Programm separat starten

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Linux-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 12.12.2007, 14:08    Titel: Programm separat starten Antworten mit Zitat

jaaaa :]
Einige habens ja sicher mitbekommen, ich code nen Cluster grinsen
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:
Code:
./cored&


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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 12.12.2007, 14:49    Titel: Antworten mit Zitat

Das wäre dann eh egal, denn DOS unterstützt schließlich auch kein Multithreading - trotzdem hat FB Unterstützung dafür. zwinkern
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 12.12.2007, 15:39    Titel: Antworten mit Zitat

Hm gut das stimmt auch wieder... ich hab inzw. mit dem englischen Channel ide API-Calls erarbeitet, mal sehen was draus wird lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 13.12.2007, 07:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 17.12.2007, 11:42    Titel: Antworten mit Zitat

@Bimi: Wo kommt denn nun die funktion "fork ()" her!?!?
Mein Freebasic 0.18 kennt das weder unter linux noch unter windows...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 17.12.2007, 23:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Linux-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz