FpWrite

FpWrite

Beitragvon Mathias » 11. Dez 2016, 18:19 FpWrite

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4263
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 11. Dez 2016, 18:29 Re: FpWrite

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
Warf
 
Beiträge: 964
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 11. Dez 2016, 19:40 Re: FpWrite

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4263
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon KenntKeinSchwein AG » 11. Dez 2016, 21:48 Re: FpWrite

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.
KenntKeinSchwein AG
 
Beiträge: 26
Registriert: 4. Dez 2016, 13:35

Beitragvon Bitschubser » 11. Dez 2016, 22:18 Re: FpWrite

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...
Bitschubser
 
Beiträge: 61
Registriert: 27. Aug 2012, 14:43

Beitragvon Mathias » 11. Dez 2016, 22:28 Re: FpWrite

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4263
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 11. Dez 2016, 22:55 Re: FpWrite

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
Warf
 
Beiträge: 964
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 11. Dez 2016, 23:10 Re: FpWrite

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4263
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 11. Dez 2016, 23:17 Re: FpWrite

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
Warf
 
Beiträge: 964
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 11. Dez 2016, 23:31 Re: FpWrite

Dann müsste es aber and heissen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4263
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 11. Dez 2016, 23:56 Re: FpWrite

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
Warf
 
Beiträge: 964
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 12. Dez 2016, 18:05 Re: FpWrite

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4263
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Linux



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried