FpWrite

Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

FpWrite

Beitrag von Mathias »

Mit diesem Mini-Programm, erzeuge ich eine kleine Text-Datei.

Code: Alles auswählen

var
  fd, fw: integer;
const
  s: string = 'Hello World';
begin
  fd := FpOpen('test.txt', O_RDWR or O_CREAT);
 
  repeat
    fw := FpWrite(fd, s[1], Length(s));
  until (fw <> -1) or (fpgeterrno <> ESysEINTR);
 
  FpClose(fd);
end

Nun zur Frage, für was ist die repeat-until-Schleife ?
Wen ich diese weg lasse, wird die Datei auch erzeugt.
Die Schleife habe ich aus der Unit sysutil kopiert, Zeile 535.

Bei FileCreate ist auch so eine Schleife vorhanden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FpWrite

Beitrag von Warf »

Die Schleife besagt einfach: Solange beim schreiben ein Fehler auftritt versuche es erneut.

Für so etwas hilft auch die Man page, bei return value steht dass -1 bedeutet dass ein Fehler aufgetreten ist, und das ESysEINTR bedeutet dass das System einen Interrupt während der operation ausgelöst hat. In beiden fällen konnte die Schreiboperation nicht ausgeführt werden, und sollte daher wiederholt werden

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FpWrite

Beitrag von Mathias »

In beiden fällen konnte die Schreiboperation nicht ausgeführt werden, und sollte daher wiederholt werden

Müsste dann anstelle von "or" nicht "and" stehen ?

Ohne dies Abfrage und wen es blöd kommt, kann es sein, das FpWrite in die Luft schreibt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: FpWrite

Beitrag von KenntKeinSchwein AG »

Mathias hat geschrieben:
In beiden fällen konnte die Schreiboperation nicht ausgeführt werden, und sollte daher wiederholt werden

Müsste dann anstelle von "or" nicht "and" stehen ?

Ohne dies Abfrage und wen es blöd kommt, kann es sein, das FpWrite in die Luft schreibt ?

Eigentlich nicht, da ein "or" zwischen Flags immer eine Verbindung ist.

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: FpWrite

Beitrag von Bitschubser »

Mathias hat geschrieben:
In beiden fällen konnte die Schreiboperation nicht ausgeführt werden, und sollte daher wiederholt werden

Müsste dann anstelle von "or" nicht "and" stehen ?

Ohne dies Abfrage und wen es blöd kommt, kann es sein, das FpWrite in die Luft schreibt ?


Ohne in die sysutil reingekuckt zu haben:
Könnte es sein, dass Fehler ungleich ESysEINTR an den Aufrufer zurückgegeben werden?
Sonst hätte man ja bei allen Fehlern eine Endlosschaleife...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FpWrite

Beitrag von Mathias »

Eigentlich nicht, da ein "or" zwischen Flags immer eine Verbindung ist.


Angenommen, fw ist <> -1, dann wird dis Schleife verlassen, obwohl bei fpgeterrno <> ESysEINTR vielleicht noch ein Fehler ist. :?:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FpWrite

Beitrag von Warf »

ESysEINTR ist kein fehler von Write, sondern einer vom Betriebsystem, das verhalten von Write ist daher nicht für diesen Fall definiert und damit muss das separat überprüft werden. Write könnte eine Beliebige Zahl zurückgeben falls ein Interrupt auftaucht

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FpWrite

Beitrag von Mathias »

Irgendwie habe ich einen Knopf in der Leitung.

Wen fw -1 ist, also ein Fehler aber mit ESysEINTR alles in Ordnung ist, wird repeat util trotzdem beendet.
Oder sehe ich da was falsch ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FpWrite

Beitrag von Warf »

Mathias hat geschrieben:Irgendwie habe ich einen Knopf in der Leitung.

Wen fw -1 ist, also ein Fehler aber mit ESysEINTR alles in Ordnung ist, wird repeat util trotzdem beendet.
Oder sehe ich da was falsch ?


Nein die schleife wird nochmal ausgeführt falls entweder write einen fehler hatte (fw = -1) oder falls das Betriebsystem einen Interrupt gefeurt hat (fpgeterrno = ESysEINTR), da dies durch das fw=-1 nicht abgedeckt ist. Wenn beides nicht der fall ist wird die schleife verlassen

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FpWrite

Beitrag von Mathias »

Dann müsste es aber and heissen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FpWrite

Beitrag von Warf »

Stimmt da hatte ich grade den denkfehler.
Wenn ein Interrupt geschieht soll abgebrochen werden. Ich gehe dann einfach mal davon aus, das ein neuer versuch dann nicht funktionieren würde

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FpWrite

Beitrag von Mathias »

Irgendwie finde ich diese Abfrage sowieso merkwürdig.

Kümmert sich nicht das OS darum, wen (fp)Write nicht auf Anhieb geht und wen alles versagt, dann wird ein Fehler ausgegeben.

Früher Bei einer Diskette, wen der Schreibvorgang nicht auf Anhieb funktioniert, hat das OS probiert den Kopf hin und her zu bewegen, bevor ein Fehler kam,.

Nochmals zu or und and zurück, vielleicht ist es erst ein Problem, wen beide Abfragen auf False kommen und der Schreibvorgang muss wiederholt werden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten