Jak bezpecne inicializovat semafor?

Karel Zak kzak na redhat.com
Pátek Prosinec 3 14:46:39 CET 2010


On Fri, Dec 03, 2010 at 11:46:51AM +0100, d.petr wrote:
> > ------------ 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

-- 
 Karel Zak  <kzak na redhat.com>
 http://karelzak.blogspot.com



Další informace o konferenci Linux