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