Entwickler-Ecke

Sonstiges (FPC / Lazarus) / Linux API - Ausgabe eines Programmes überwachen...


gonzo_16 - Fr 14.01.05 10:29
Titel: Ausgabe eines Programmes überwachen...
Hallo...

Ich Kann ja mit Libc.System('blabla') tolle Sachen starten. Aber: Wie kann ich kontinuierlich die Ausgabe des Programmes abfragen?

Moderiert von user profile iconAXMD: Tippfehler im Titel korrigiert.


patrick - Fr 14.01.05 10:33

was verstehst du unter "ausgabe" :?:
datei, meldungen....


gonzo_16 - Fr 14.01.05 20:43

Mit Ausgabe, meine ich z.B. wenn ich seti@home starte, dsa ich die Ausgabe des Clients in einem Memofeld darstellen kann. Oder bei ls, das ich alle dateinen die es listet in einem memofeld sehe. Oder eine Manpage in einem Memofels sehe...
WEnn es dir weiterhilft...das was man unter C mit einer pipe realisieren kann.
thx GonZo


tommie-lie - Fr 14.01.05 21:08

gonzo_16 hat folgendes geschrieben:
das was man unter C mit einer pipe realisieren kann.
Das müsste man in Pascal auch mit einer Pipe realisieren können. Frag' mich nicht wie's unter Linux geht, aber du scheinst es ja zu wissen ;-)
Ansonsten weiß ich, daß man (zumindest über die Kommandozeile, mit System() habe ich es noch nicht ausprobiert) die Ausgabe des Programmes in eine Datei umleiten kann. Die könntest du in deinem Programm alle x Sekunden neu auslesen. Das wäre allerdings die unschöne Lösung, die zudem noch eine anschließende Löschung der temporären Datei erfordert, die Lösung mit einer Pipe ist also schon die bessere.


gonzo_16 - Sa 15.01.05 03:57

Ja nur habe ich mit der pipe (bei C) das Problem, das wenn ich ein Prgramm wie SETI starte, die Pipe übereinen seperaten Thread auslesen müsste, da sie für lange zeit nicht leer wird. Nur ist threadprogrammierung sehr kompliziert...das mit der DAtei wäre ne idee...zwar unschön aber effizient


tommie-lie - Sa 15.01.05 11:19

gonzo_16 hat folgendes geschrieben:
Nur ist threadprogrammierung sehr kompliziert...
TThread gibt's AFAIR auch von der Kylix-RTL.
Ansonsten weiß ich nur, daß Thread-Programmierung unter Windows ohne die VCL noch das einfachste ist, was ich je mit der API gemacht habe, ich weiß aber natürlich nicht, wie es unter Linux damit aussieht, kann mir aber nicht vorstellen, daß es großartig anders sein kann.


gonzo_16 - So 16.01.05 20:04

jo..bei kylix habe iuch keine ahnng wie das geht...bei C isses jedenfalls nicht so einfach...


opfer.der.genauigkeit - Do 20.01.05 11:44

Also mir ist nur teilweise klar, was du machen möchtest.
Bzw. für die Formulierung gibt es unter Linux sicherlich tausend Lösungen.

Der Client, von dem du die Nachrichten lesen willst schickt die Nachrichten wohin?
Von wo willst du sie lesen? Vom Standart - Output? Denn | bzw. >> in C macht nix anderes als in den std- output schreiben, solange der Prameter nicht geändert wurde.
D.h. dein Client, wenn er Nachrichten schickt, muß ein Ausgabeziel haben.
Entweder eine Datei oder eine Console wte.
In beiden Fällen kannst du die Ausgabe wie eine Datei einlesen.

Nen Thread müßtest du auch nicht schreiben, wenn du da nicht so die Erfahrung hast. N Timer reicht doch :shock: .. oder etwa nicht :?:


gonzo_16 - Mo 07.02.05 18:06

um es dir einfacher zu mache und lange umschreibunge zu sparen (bin noch neu be Kylix, und kann meine Probleme schlecht beschreiben)
Ich möchte diesen C-Code in Kylix umsetzen:
Jetzt mal ganz einfach dargestellt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>

int main()
{
   char buffer[2048];
   FILE* pipe = popen("/bin/sh -c ls", "r");
   while (!feof(pipe))
   {
        fgets(bufer, 2048, pipe);
        printf("%s", buffer);
   }
}


retnyg - Mo 07.02.05 18:23

http://www.swissdelphicenter.ch/de/showcode.php?id=990 <- so ginge es bei windoze =)


opfer.der.genauigkeit - Di 08.02.05 22:35

Weiß nicht ob dir das weiterhilft, wenn ja, bitte um Rückmeldung, dann merk ich mir den Link.
Hab mal rumgeschnüffelt.

http://mailman.fastxs.net/pipermail/dbmail/2002-July/000811.html

Scheint sich dabei um ne Drittkomponente zu handeln.


gonzo_16 - Do 10.02.05 01:38

genau das habe ich gebraucht...nun weiss ich wie das mit der Pipe funktioniert...
Nur Leider hat das mit den Uses die er benutzt hat in meinem Kylix nicht hin...er SAgt er wisse nicht was TPipe ist...hm

schon mal Vielen Dank


gonzo_16 - Do 10.02.05 02:15

hqab von nem Freund gesagtr bekommen wie es geht: hier ein Beispiel um ls auszuführen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var pioF: PIOFile;
 l: Integer;
 cmd: pChar;
begin
  GetMem(cmd,10000) ;
  pioF:=LibC.pOpen('ls','r');
  Libc.fread(cmd,1,10000,pioF);
  LibC.pclose(pioF);
  memo1.Lines.Add(cmd);
  FreeMem(cmd,10000);


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.