AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Einen Prozess starten und input und output stream verbinden auf z.b. Linux
Thema durchsuchen
Ansicht
Themen-Optionen

Einen Prozess starten und input und output stream verbinden auf z.b. Linux

Ein Thema von QuickAndDirty · begonnen am 25. Jul 2025 · letzter Beitrag vom 29. Jul 2025
Antwort Antwort
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.053 Beiträge
 
Delphi 12 Athens
 
#1

Einen Prozess starten und input und output stream verbinden auf z.b. Linux

  Alt 25. Jul 2025, 10:35
In Lazarus gibt es TProcess.
Eine klasse die Prozesse starten kann und deren Input- und Outputstream abfangen kann.
Das geht auf windows und in POSIX systemen.

Kann man sowas mit einer solche Klasse oder auf anderem Wege auch in Delphi machen? Vor allem für Posix oder Linux/Android systeme?
Andreas
Nobody goes there anymore. It's too crowded!

Geändert von QuickAndDirty (25. Jul 2025 um 10:52 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.210 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux

  Alt 25. Jul 2025, 11:10
https://github.com/pyscripter/pascal-process ?
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.053 Beiträge
 
Delphi 12 Athens
 
#3

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux

  Alt 25. Jul 2025, 13:39
Das könnte es sein!
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
QuickAndDirty
Online

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.053 Beiträge
 
Delphi 12 Athens
 
#4

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux

  Alt Heute, 12:38
Also ich havbe die unit PascalProcess mal ausprobiert... mehrere tage.
Es scheint gut für manche dinge zu funktionioeren aber andere wiederum nicht so .
Delphi-Quellcode:
procedure ProcessTest;
Begin
  var output:TBytes;
  
  //Funktioniert
  output := TPProcess.Execute('/system/bin/ls -l ttyS9', '/dev' );//output = '--x---x---x ttyS9 hasse nicht gesehen'
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));

  //Funktioniert anscheinend irgendwie nicht alle '*' eingaben kann ls nicht über TPProcess
  output := TPProcess.Execute('/system/bin/ls -l tty*', '/dev' );//output = 'no such file tty*'
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));

  //Ich weiß nicht ob es funktioniert, aber kein output und auch kein effekt, aber auch keine Fehlermeldung
  output := TPProcess.Execute('/system/bin/su root /system/bin/ls -l ttyS9', '/dev' );//output = ''
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));
  output := TPProcess.Execute('/system/bin/su root /system/bin/chmod 777 /dev/ttyS9', '/dev' );//output = ''
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));
end;
Ich glaube dass wenn ich /system/bin/su erzeuge, die Pipes für in/out/err nicht wirklich mit dem Process verbunden sind aber dennoch existieren...deswegen bekomme ich keine Fehlermeldung winn ich in die "in" pipe schreibe und keine error Meldung wenn ich die outpipe auslese...
ich habe das versucht mit nem interaktiven process.

Delphi-Quellcode:
Procedure SetFileRights(const fileRights:String);
Begin
  var report:string;
  try
    var Attributes := TFile.GetAttributes('/dev/ttyS9');
    report := report + 'WriteRights:'+ord(TFileAttribute.faOthersWrite in Attributes).ToString+slineBreak;
    var Process:IPProcess := (TPProcess.Create( '/system/bin/su', '/dev' ) as IPProcess);
    report := report + 'Process Created'+slineBreak;
    Process.MergeError := true;
    Process.Execute;
    report := report + 'Process started'+slineBreak;
    Sleep(150);
    var chmod_Command := 'chmod '+fileRights+' /dev/ttyS9'+linefeed;
    report := report + 'chmod_Command composed: '+chmod_Command+slineBreak;
    var cmd:TBytes := Tencoding.UTF8.GetBytes(UTF8Encode(chmod_command));
    Process.WriteProcessInput(cmd);
    report := report + 'chmod_Command written '+slineBreak;
    Sleep(150);
    report := report + 'Process-Output:' + Tencoding.utf8.Getstring(Process.Output)+slinebreak;
    var exit_Command := 'exit'+linefeed;
    report := report + 'exit_Command composed: '+exit_Command+slineBreak;
    cmd := Tencoding.UTF8.GetBytes(UTF8Encode(exit_Command));
    Process.WriteProcessInput(cmd);
    report := report + 'exit_Command written '+slineBreak;
    Sleep(150);
    Process.Waitfor;
    report := report + 'Process Ended' + slineBreak;
    report := report + 'Process-Output:' + Tencoding.utf8.Getstring(Process.Output)+slinebreak;
    Attributes := TFile.GetAttributes('/dev/ttyS9');
    report := report + 'WriteRights:'+ord(TFileAttribute.faOthersWrite in Attributes).ToString+slineBreak;
  except
    on E:Exception do
    Begin
      report := report +'Exception: '+ e.Message+slinebreak;
    end;
  end;
  sleep(200);
  TDialogService.ShowMessage( Report);
end;
Kein Ergebnis kein output und aber auch keine Fehler

Mache ich irgend etwas falsch?
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz