Zamykani pres flock()

Jan Kasprzak kas na fi.muni.cz
Čtvrtek Červen 11 16:42:03 CEST 2009


Honza Pazdziora wrote:
: On Fri, Jun 05, 2009 at 12:07:56AM +0200, Jan Kasprzak wrote:
: > 
: > Vynecham dalsi slepe cesty a napisu happy end: nakonec pomohlo
: > nahradit $fh->print() za syswrite($fh, ...). Ale fakt nechapu proc
: > to pomohlo, kdyz flock by prece mel zajistit, ze do souboru nebude
: > po tu dobu zapisovat nikdo jiny (pokud ten jiny si taky zkusi zavolat
: > flock, coz jsem delal).
: 
: A neni to tak, ze ten print ten zapis bufferoval, takze z hlediska
: systemu tam nikdy ta chybejici data nebyla a drzel si je Perl?

	Ale vzdyt pisu ze jsem jednak delal explicitni flush pred odemcenim,
a jednak podle dokumentace perlovy flock() v sobe to flush zahrnuje:

       flock FILEHANDLE,OPERATION
               [...]
               To avoid the possibility of miscoordination, Perl now flushes
               FILEHANDLE before locking or unlocking it.


: Kdyz
: si pustis strace, tak predpokladam uvidis, ze se tam zapisovalo
: 16 bajtu, ne 20, mozna proto, ze ten 16 vyslo na zlom bufferu nebo
: neceho.

	No jasne, takhle nejak to bylo. Akorat me fakt zajima proc.

: > Overoval jsem si, ze fakt zapisuju blok velikosti delitelne dvaceti.
: > Dokonce jsem za flock() dopsal seek na konec a pres tell jsem zjistoval
: > jestli soubor ma velikost delitelno dvaceti: stavalo se ze nemel. Coz
: > znamena, ze i uvnitr flock() byly videt "castecne zapisy", nebo ze
: > flush() nedela co ma. Nevim.
: 
: Spis bych rekl, ze print nedela, co od neho ocekavas.
: 
: Kdyz bys na ty filehandly udelal ->autoflush() tak to taky nefunguje?
	
	Tak predpokladam ze autoflush je totez co explicitni flush
za tim jedinym printem, ktery jsem do toho filehandlu v programu delal.
Nebo nerozumim co mas na mysli.

	Co nefungovalo bylo

flock $fh, LOCK_EX;
print $fh $data;
flush $fh;
flock $fh, LOCK_UN;

	Co fungovalo bylo

flock $fh, LOCK_EX;
syswrite $fh, $data;
flock $fh, LOCK_UN;

-Y.

-- 
| Jan "Yenya" Kasprzak  <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839      Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/    Journal: http://www.fi.muni.cz/~kas/blog/ |
>> If we wanted to trade simplicity and kewl design for usability I think <<
>> we all know the URL of the Apple Store.               --jmorris42 @LWN <<


Další informace o konferenci Perl