zapis do jedneho suboru z viacerych procesov

Alexandr Malusek malusek na hroch.ujf.cas.cz
Čtvrtek Srpen 3 14:32:26 CEST 2000


igor.kilian na infogas.sk (Igor Kilian) writes:

> Ak sa otvori subor na pridavanie pomocou >> ,tak pocas bezania tohoto jobu
> moze iny proces do neho zapisat, dany zaznam sa nestrati (pripisuje sa
> pomocou presmerovania >>).

To je sice pravda, ale popisovat mechanismus soucasneho zapisu do
souboru pomoci pojmu jako ztracene zaznamy, ... je silne
matouci. Skoro bych rekl, ze kdo ten mechanismus nezna, by mohl ziskat
pocit, ze je to magie.

V konstrukci

job1 > file & job2 > file

neni ukazovatko aktualni pozice v souboru file pro proces job1 (viz
lseek(2)) ovlivnovano zapisy procesu job2 a naopak - kazdy z procesu
ma vlastni ukazovatko, jehoz pozice se zapisem posouva. Proto dochazi
k vzajemnemu prepisovani zaznamu, ktere se navenek muze jevit jako
jejich ztraceni.

V konstrukci:

{ job1 & job2; } > file

maji oba procesy spolecne ukazovatko - k prepisovani proto nedochazi.

Pri pouziti ">>" otevre shell soubor s volbou O_APPEND, takze pred
kazdym zapisem se napred provede premisteni ukazovatka na soucasny
konec souboru a tudiz k prepisovani take nedochazi.

> Ak sa otvori subor na pridavanie pomocou > tak pocas bezania tohoto
> jobu moze iny proces do neho zapisat, aj sa dany riadok zapise, ale
> ma to jednu chybu. Ide o to, ze primarny proces ktory otvoril tento
> subor zapisuje dalej a prepise tento zaznam.

To je obvykle pravda, ale pro stdout si mod O_APPEND muze kazdy proces
nastavit pres fcntl(2).  Obecne proto nelze tvrdit, ze v konstrukci
"job1 > file & job2 > file" bude dochazet k prepisovani dat.

> Cize ak ho treba na zaciatku vymazat tak radzej pomocou "cp
> /dev/null $subor".

Pro zkraceni souboru na nulovou delku lze v shellu pouzit konstrukci

> file

Funguje to v bash, ksh, ... ale nevim, jestli to POSIX specifikuje.

--
A. Malusek  (malusek na ujf.cas.cz)
UJF AV CR


Další informace o konferenci Linux