PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einstieg in Prozessprogrammierung


maxip
07.02.2005, 14:28
Hi,


ich möchte in reinem C ein Programm schreiben, dass von aussen gesteuert wird, z.B. über eine MySQL Datenbank oder über Dateien oder sonstwie (kann man einem laufendem Prozess Nachrichten schicken mit PHP ?).

Ich bräuchte einen Denkanstoss bzw. ein paar hilfreiche Links.

Ich möchte also ein Prozess haben, der die ganze zeit läuft, und wenn was zu tun ist, dann arbeitet er den Auftrag ab und ansonsten soll er im Leerlauf sein und möglichst keine oder sehr wenig ressourcen fressen.

Wie mache ich sowas ?

Ich möchte jetzt nicht unbedingt eine komplette Anleitung, sondern nur ein grobes Schema, wie man das von mir gewünschte in C und unter Linux umsetzt.

Reicht es, das Programm als Hintegrundprozess zu starten ?
Mus ich dann im Programm einfach eine Schleife machen ?




cya max


butterkeks
07.02.2005, 16:48
da gibt's einiges...

Du könntest das ganze über ein fifo lösen:

Das Programm wird, wie du schon vorgeschlagen hast, als Daemon im Hintergrund gestartet und liest permanent aus einem fifo.
Das blockiert den Prozess so lange, bis Daten da sind und verbraucht kaum Ressourcen.
Sobald Daten eintreffen, wird die gewünschte Aktion durchgeführt und alles beginnt von neuem.

maxip
07.02.2005, 22:48
danke für den tipp

einfach ./programmname &disown und dann läufts als hintergrundprozess

hab do {
...
} while(1)


beendet wird halt wenn ich den prozesskille

läuft auch weiter wenn man sich ausloggt

maxip
07.02.2005, 23:23
ist es auch möglich, das programm quasi im leerlauf zu haben und nur wenn eine nachricht geschickt wird, dass dann gearbeitet wird ?

und wie schickt man einem laufendem programm eine nachricht ?

butterkeks
07.02.2005, 23:44
Wie gesagt, du schickst dem Programm über ein fifo Nachrichten:
PHP-Seitig öffneste einfach da Fifo wie jede andere Datei, schreibst deinen Befehl hinein und schließt das ganze. Fertg.

Das mit dem Leerlauf ist einfach zu lösen:
Wenn dein Prog aus einem Fifo liest und Daten da sind, werden diese raus geholt und können verarbeitet werden.

Sollten keine Daten da sein, wartet das Programm einfach von selbst, bis Daten da sind; du brauchst also keine spezielle Warteschleife oder sowas zu bauen.

So ohne weiteres ist es nur möglich, einen Befehl auf einmal abzuarbeiten, auch wenn beliebig viele Prozesse Daten senden können; Ob das so erwünscht ist oder nicht, ist deine Sache.

Willste mehrere Befehle (quasi) gleichzeitig verarbeiten, musste auf Multithreading oder fork() zurückgreifen

maxip
08.02.2005, 00:23
hi, ich habe ein wenig nach fifo gegoogelt (neudeutsch :D ), aber so ganz ist mir das Prinzip nicht klar.


kannst du mir vielleicht ein kleine sbeispiel dazu geben wie ich das genau mache ?

ich möchte z.B. nach einer eingabe ein datenbankupdate machen...


hab gehört dass man mit fifo irgendwie eigen pipes anlegen kann ( > pipe ) aber wie geneau is mir schleierhaft

oder vielleicht hast du ja einen link auf lager


das mit fork habe ich in diesem zusammenhang auch schon gelesen und halte das für eine gute idee, man hat also quasi einen daemon, und für jede eingabe startet dieser ein kind und lässt das kind die arbeit machen :)

butterkeks
08.02.2005, 13:48
Genau, so meinte ich das mit fork(); Musst das ganze nur vernünftig begrenzen, damit dir nicht die Ressourcen ausgehen.

Mit fifos kannste prima per Shell rumspielen:

Starte zuerst 2 Terminal Emulatoren oder VTs.
In Terminal 1 gibste folgendes ein:

$ mkfifo blah
$ cat blah

Das Terminal sollte nun stehen bleiben.

Im 2. gibste folgendes ein:

$ echo "Hallo" > blah

Und in Terminal 1 steht plötzlich ein "Hallo".

Ein Daemon hätte "Hallo" nun nur noch geparst, verarbeitet und hätte dann wieder read() auf das Fifo ausgeführt, um neue Befehle zu holen.

Beachte, dass das Terminal stehen geblieben ist, als du "cat blah" eingegeben hast.
Das passiert automatisch, deshalb brauchste keinen extra loop zu bauen, wie oben bereits erwähnt.

Achte darauf, dass der Sender das fifo nach dem Senden der Daten schließt!
Der Empfänger kriegt alle Daten bis zum EOF in einem Rutsch, nicht bis '\n', wie ich zunächst fälschlicherweise mal dachte.

Siehe auch:
man 3 mkfifo - Ein FIFO in C erstellen
man 4 fifo - generelle Infos über FIFOs

maxip
08.02.2005, 14:06
ok vielen dank

werde mich nun da einlesen :)