Re: Jak bezpecne inicializovat semafor?

d.petr d.petr na post.cz
Pátek Prosinec 3 14:30:22 CET 2010


Aha. No když náhrada není (nejspíš), tak to budu muset vyřešit jinak. Možná jen chvíli počkám (kritická sekce bude dost rychlá, takže nebudu muset čekat moc dlouho) a pak prostě do kritické sekce vstoupím i bez semaforu. A sem_post na konci sekce ten semafor zas vrátí do funkčního stavu.
Že bez sem_unlink zůstává semafor v systému, vím a nevadí mi to. Aspoň se na něj a do něj dá pořád koukat pomocí mc. :-)
Teď mě napadá: že bych ten POSIXový semafor verze 2 použil jen k bezpečnému a spolehlivému vytvoření semaforu System V, v němž lze použít SEM_UNDO? No, nebudu to přehánět. :-D
Každopádně ještě jednou díky.
PM


> ------------ Původní zpráva ------------
> Od: Frantisek Boranek <fboranek na kerio.com>
> Předmět: Re: Jak bezpecne inicializovat semafor?
> Datum: 03.12.2010 13:58:48
> ----------------------------------------
> Pokud se nemylim tak nahrada SEM_UNDO v tomto API neni a neznam elegantni
> reseni. Dalsi vec, ktera by Vas mohla zajimat, ze semafor preziva i po ukonceni
> vsech procesu, pokud posledni z nich nezavola "sem_ulink". sem_unlik nemusi
> nastesti volat az posledni proces, ale lze ho zavolat v kazdem z nich po
> zavolani close. K fyzickemu odstraneni totiz dojse az po uvolneni vsemi
> procesy.
> 
> F.
> 
>   _____  
> 
> From: d.petr [mailto:d.petr na post.cz]
> To: Diskuse o Linuxu v cestine [mailto:linux na linux.cz]
> Sent: Fri, 03 Dec 2010 11:46:51 +0100
> Subject: Re: Jak bezpecne inicializovat semafor?
> 
> > ------------ 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.
>   PM



Další informace o konferenci Linux