Re: Jak bezpecne inicializovat semafor?

d.petr d.petr na post.cz
Pátek Prosinec 3 15:38:45 CET 2010


> > > ------------ Původní zpráva ------------
> > > Od: Frantisek Boranek <fboranek na kerio.com>
> > > ----------------------------------------
> > > Lze pouzit napr:
> > > 
> > >  mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
> > >  int flags = (failIfExist) ? (O_CREAT | O_EXCL) : O_CREAT;
> > >  sem_t *hSemaphore = sem_open(name.c_str(), flags, mode, initValue);
> > > 
> > > vic v man sem_open
> > > 
> > > Frantisek
> > 
> > Ještě jednou děkuji za navedení, skutečně se mi podařilo semafory
> > tímto způsobem (nazývají to POSIXové API 2) rozchodit. Skoro všechny
> > požadavky mám splněny, jen jeden ještě chybí: vstoupí-li program do
> > kritické sekce (a zamkne si semafor) a uvnitř této sekce je násilně
> > ukončen, zůstává semafor zamknutý (vynulovaný). "Staré" semafory
> > System V měly ve funkci semop možnost příznaku SEM_UNDO, který
> > zajistil odemčení semaforu po případném zboření procesu uvnitř
> > kritické sekce (jestli jsem to pochopil správně). Existuje něco
> > podobného i pro sem_open nebo sem_wait, nebo to budu muset ošetřit
> > jinak (asi s využitím sem_timedwait a pak nějak pořešit)? Mně se
> > nepodařilo náhradu SEM_UNDO najít.
> 
>  Asi trosku odboceni od tematu, ale pokud bych pouzival POSIXovou
>  sdilenou pamet -- shm_open() + mmap(MAP_SHARED) -- maje v rukou file
>  descriptor neslo by pak pro synchronizaci tech pristupu k te pameti
>  pouzivat flock() s tim, ze pekne mohu odlisit zamknuti pro cteni a
>  zamknuti pro zapis? Zamerne pisu synchronizaci a ne ochranu
>  (mprotect). Nezkousel jsem to, jen mne to napadlo ;-)
>  
>     Karel

shm_open ... ach jo, začal jsem se shmget. Zase ten POSIX <> System_V. 
V té sdílené paměti budu mít několik bufferů a pro synchronizaci přístupu procesů jsem předpokládal pro každý buffer jeden příznakový bajt. Podle těch příznaků každý proces pozná, který buffer může momentálně použít a zpět do příznaku zapíše buď, že příslušný buffer zrovna obsadil, nebo v jakém ho nechal stavu. A už jsem ani nepomýšlel na nějakou svoji synchronizaci této synchronizace a usoudil jsem, že nejlepší bude přístup k příznakům řídit semaforem. Stačil by i mutex, ale protože teď zatím nevím, jak na něj a jestli to vůbec lze, tak si ho nechám jako možné vylepšení do budoucna. :-)
PM



Další informace o konferenci Linux