GNU/Linux >> Znalost Linux >  >> Linux

Jak obnovím semafor, když selže proces, který jej snížil na nulu?

Ukázalo se, že neexistuje způsob, jak spolehlivě obnovit semafor. Jistě, každý může post_sem() na jmenovaný semafor, aby se počet opět zvýšil nad nulu, ale jak zjistit, kdy je takové zotavení potřeba? Poskytované rozhraní API je příliš omezené a žádným způsobem neindikuje, kdy k tomu došlo.

Dejte si pozor na dostupné nástroje ipc -- běžné nástroje ipcmk , ipcrm a ipcs jsou pouze pro zastaralé semafory SysV. Konkrétně nefungují s novými semafory POSIX.

Ale vypadá to, že existují další věci, které lze použít k zamknutí věcí, které operační systém automaticky uvolní, když aplikace zemře způsobem, který nelze zachytit v obslužném programu signálu. Dva příklady:naslouchající soket vázaný na konkrétní port nebo zámek na konkrétní soubor.

Rozhodl jsem se, že zámek na souboru je řešení, které jsem potřeboval. Takže místo sem_wait() a sem_post() zavolejte, používám:

lockf( fd, F_LOCK, 0 )

a

lockf( fd, F_ULOCK, 0 )

Když se aplikace jakýmkoliv způsobem ukončí, soubor se automaticky zavře, čímž se také uvolní zámek souboru. Ostatní klientské aplikace čekající na „semafor“ pak mohou volně pokračovat podle očekávání.

Díky za pomoc, kluci.


Místo semaforu použijte soubor zámku, podobně jako řešení @Stéphane, ale bez volání flock(). Soubor můžete jednoduše otevřít pomocí exkluzivního zámku:

//call to open() will block until it can obtain an exclusive lock on the file.
errno = 0;
int fd = open("/tmp/.lockfile", 
    O_CREAT | //create the file if it's not present.
    O_WRONLY | //only need write access for the internal locking semantics.
    O_EXLOCK, //use an exclusive lock when opening the file.
    S_IRUSR | S_IWUSR); //permissions on the file, 600 here.

if (fd == -1) {
    perror("open() failed");
    exit(EXIT_FAILURE);
}

printf("Entered critical section.\n);
//Do "critical" stuff here.

//exit the critical section
errno = 0;
if (close(fd) == -1) {
    perror("close() failed");
    exit(EXIT_FAILURE);
}

printf("Exited critical section.\n");

Toto je typický problém při správě semaforů. Některé programy používají jediný proces pro správu inicializace/mazání semaforu. Obvykle tento proces dělá jen toto a nic jiného. Vaše ostatní aplikace mohou počkat, až bude semafor k dispozici. Viděl jsem to udělat s API typu SYSV, ale ne s POSIX. Podobné jako „Kachna ' pomocí příznaku SEM_UNDO ve vašem volání semop().


Ale, s informacemi, které jste poskytli, bych navrhoval, abyste semafory nepoužívali. Zvláště pokud vašemu procesu hrozí zabití nebo zhroucení. Zkuste použít něco, co za vás OS automaticky vyčistí.


Linux
  1. Jak obnovit smazaný soubor v Linuxu

  2. Nový rodičovský proces, když rodičovský proces zemře?

  3. Jak se zotavit poté, co Kate havaruje?

  1. Jak mohu forkovat proces, který nezemře, když shell opustí?

  2. Co se stane, když je soubor, který je 100% stránkován do mezipaměti stránek, upraven jiným procesem

  3. Jak najít soubor .pid pro daný proces

  1. Jak najít balíček, který poskytuje konkrétní soubor v Linuxu

  2. Jak přidat nový řádek na konec souboru?

  3. Jak odstranit soubory .fuse_hidden*?