Portál AbcLinuxu, 5. května 2025 19:30
Zdravim,
mam nasledujici dotaz. Pisu v jazyce C (pro linux) urcitou aplikaci. Je pravdepodobne, ze bude spustena vicekrat v danem case (nekolik procesu). Aplikace bude cist data ze souboru (text), ale muze obcas nastat situace, ze se v tomtez souboru provedou zmeny (pridani, nahrazeni, mazani). Zajimalo by mne, kdyz bude mit nekolik procesu tento soubor otevreno pro cteni a jiny proces otevre tentyz soubor pro zapis a provede zmeny
napr.: proces1 ma otevren soubor.txt pro cteni (je nastaven na pozici zacatku desateho radku), proces2 ma otevren soubor.txt pro zapis (maze desaty radek)...
jak se zachova proces1, ktery chce cist radek c.10,ale proces2 ho vymazal? A vymaze ho vubec?Jak mohu vedet, ktery proces dostane prioritu k provedeni sveho ukonu drive?
Resi tohle jadro a nebo libc automaticky a nebo se to musi v programu osetrit?
Dekuji za reakce.
Potrebuji to mit prave v textovem souboru. Jedna se o aplikaci (extreni content filter pro postfix) k filtrovani a kontrole posty.
Jedine co bude v txt souboru je seznam platnych emailovych adres v me domene.
adresa1@domena.cz
adresa2@domena.cz
. . .
Takze se da ocekavat, ze se tento soubor bude menit jen velmi malo (nova adresa / smazani stare adresy), nicmene
muze ke zmene dojit kdyz s nim bude zrovna jiny proces pracovat. Textovy soubor volim predevsim pro jednoduchost,
moznost editace / zobrazeni v jakemkoli editoru, atd.
Specifikaci sice vyžaduje, aby knihovní fce rename() byla atomická, ale nejsem si jistý zda-li to opravdu platí a hlavně jestli pro všechny filesystémy.
Když pomineme Linux, tak se najde určitě ještě spousta Unixů, které s tím mají problém On how rename is broken in Mac OS X.
Raději bych opravdu zvolil zamykací soubor.
Momentalni koncepce programu je takova, ze se spousti pro kazdy mail solo.
Premyslel jsem napsat to jako klient - server aplikaci, kdy serverova cast by drzela v
pameti konfiguraci a data a klient posilal veci ke zpracovani serveru. Tim by bylo
vse vyreseno,ale casova narocnost a vetsi komplikovanost (i vice moznych chyb) mne od toho odradila.
A proč by externí filtr nemohl číst seznam adres z DB místo ze souboru?
Protoze proti DB (MySQL) se overuje pop3/smtp, s toutez DB pracuje i maildrop.
Nedovedu presne odhadnout jeji zatizeni (obcas v logu narazim na hlasku "Prilis mnoho spojeni." limit
je nastaven myslim na 200) takze dalsi komunikace s DB by znamenalo jeste vetsi zatez DB. Ale mozna
to bude nakonec jedine rozumne reseni.
Toho bych se nebál, mysql je pro takto jednoduché dotazy v pohodě. Režie bude minimální. Určitě spolehlivější, než se mořit se zamykáním souboru. Jedině snad opakované připojování do DB při každém běhu skriptu - možná popřemýšlet o nějakém serverovém poolu konexí, ale to už je velká komplikace.
Musíš vyřešit spolupráci mezi procesy. Více informací nalezneš v knize Linux - Začínáme programovat, překlad 4. vydání (Neil Matthew, Richard Stones), originál v PDF druhého vydání [2,8MB]. Je tam pěkně popsané využívání souboru "zámku", který je vytvořen jedinou atomickou operací tj. flag O_EXCL
a poté následuje vysvětlení a ukázky jak zamykat jen část souboru. Začíná to na straně 215.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.