Pascal program Windows alatt rendben működik, Linux alatt bizonyos esetekben nem ad kimenetet, mi lehet ennek a magyarázata? (bővebben lent)
Pascal-ban írtam egy programot, amely szisztematikusan teszteli a puffert: beolvassa egy pufferméretttel a fájlt, majd növeli a pufferméretet, amíg egy határt el nem ér, ekkor kilép a program...
Linux alatt bizonyos nagyságú fájlok esetén nem kapok kimenetet egyáltalán, akkor sem, ha a text fájlt kiveszem a programból és > jellel szeretném megkapni a kimenetet (fájlba irányítom), 0 byte marad a kimenet akoris ha a program lefut, órákig tesztel...
Pár kb-os fájlok esetén korrekten megjelenik a kiemnet...
A helyzet a következő: Linux nincs a gépre ténylegesen telepítve, hanem Boot Live CD-ről fut, feltelepítettem az fp-compiler csomagot, mount-oltam egy NTFS fájlrendszert tartalmazó külső merevlemezt a /mnt alá és ezen teszteltem egy DVD méretű fájllal.
Ha a kimenetet a /root/kimenet.txt-be mentem, akkor is hiába, 0 byte...
Windows alatt minden korrekten, normálisan működik, a program elindításának pillanatában már rögtön nem 0 byte a kimenet.txt file mérete, hiszen beleírja a bájt számot, tehát rögtön növekednie kell...
Eljátszottam egyébként "file of string"-gel is a text fájl helyett ezt a játékot, ami azt eredményezte, hogy egyetlen kimeneti érték került eltárolásra...
Meglehetősen értetlenül állok azelőtt hogy esetlegesen ezt mégis mi okozhatja...
A root fájlrendszeren - mivel a memóriában fut - ezért csak kis fájlokkkal tesztelhettem, mert nagyobbb nem férne el, egy 500 megás fájl esetén a kimenet korrenten megjelent...
Na jó mondjuk egy gigással még tesztelhettem volna, ha a /dev/null-ba írom a kimenetet...
Tehát, mi a hiba?
Uses SysUtils;
Const
mb = 1048576;
Var
data : array [1..64*mb] of Byte;
dt,dt2 : TDateTime;
nr,nw : Longint;
inf,outf: File of Byte;
meddig : Byte;
mennyit : Longint;
f : Text;
Begin
Assign(inf,paramstr(1));
Assign(outf,paramstr(2));
Reset(inf);
Rewrite(outf);
Assign(f,'/root/kimenet.txt');
ReWrite(f);
mennyit := mb Div 2;
meddig := 0;
Repeat
Seek(inf,0);
Writeln(f,mennyit,' byte:');
dt := Now;
While Not Eof (inf) Do
Begin
BlockRead(inf,data,mennyit,nr);
BlockWrite(outf,data,nr,nw);
End;
seek(outf,0);
dt2:=now;
Writeln(f,'Eltelt ido: ',(DT2-DT)*24*3600:0:2,' sec');
Inc(meddig,2);
mennyit := mb * meddig;
Until(meddig =36);
Close(inf);
Close(outf);
Close(f);
End.
Én mindössze annyit változtattam a programodon, hogy a fájlműveleteknél illendőségből beraktam az ellenőrző direktívákat, és tessék-lássék megpróbáltam kezelni az esetleges IO-problémákat, illetve nem a rootba küldtem az kimenet.txt fájlt, csak a program mellé. Azt hiszem, ez a lényegen semmit sem változtat. Itt a kód:
Egy háromszáz megás meg egy 1.6 fájlon kipróbálva, amennyire meg tudom ítélni, semmi rendellenesség nem mutatkozott futtatáskor. Itt a két kimenet:
Ha ez hasonlít arra, amit elvársz, akkor valószínű, hogy a sajátos futtatási körülmények okozhatják a problémát, nálam okosabbtól kérdezd, hogyan. Én Linux Mint 14.04 rendszeren fordítottam és futtattam.
Nagyon köszönöm a válaszokat.
Coopper javasolta a flush(f); alkalmazását és ez volt a nyerő. :-)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!