Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: charlie 14. 12. 2010, 01:24:36

Název: Semafor a zastavení procesů
Přispěvatel: charlie 14. 12. 2010, 01:24:36
Zdravim,
mam problem se semaforem.
Mam program server klient. Server se rozforkuje na x procesu, ktere resi registraci nebo login svych uzivatelu. Vsechny procesy k tomu potrebuji pristupovat k souboru registrace.txt. Vytvoril jsem semafor. Kdyz dam jeden proces pozastavit uprostred registrace resp. zapisu do souboru registrace.txt, tak ostatni procesy, ktere chteji vstoupit se do souboru se zastavi. Kdyz pak prvni proces necham pokracovat a dokoncit zapis, tak se mi ale ostatni pozastavene procesy neprobudi a nepokracuji....

Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include "my_semaphore.h"

/* Zamčení zámku */
void lock(int semid)
{
    struct sembuf sb;
    sb.sem_num = 0;
    sb.sem_op = -1; /* operace P */
    sb.sem_flg = SEM_UNDO; /* vrátit operaci při skončení procesu */
    if(semop(semid, &sb, 1)) {
perror("semop(-1)");
exit(EXIT_FAILURE);
    }
}

/* Odemčení zámku */
void unlock(int semid)
{
    struct sembuf sb;
    sb.sem_num = 0;
    sb.sem_op = 1; /* operace V */
    sb.sem_flg = SEM_UNDO; /* vrátit operaci při skončení procesu */
    if(semop(semid, &sb, 1)) {
perror("semop(1)");
exit(EXIT_FAILURE);
    }
}
Název: Re: Semafor a zastavení procesů
Přispěvatel: kagro 14. 12. 2010, 07:19:12
Zdravim,

nevidim nikde vytvorenie semafora, je dobre inicializovany?
Název: Re: Semafor a zastavení procesů
Přispěvatel: charlie 14. 12. 2010, 08:50:16
Semafor je vytvoreny.

int semid_file;

Kód: [Vybrat]
    if((semid_file = semget(IPC_PRIVATE, 1, IPC_CREAT | SEM_R | SEM_A)) < 0) {
perror("semget()");
exit(EXIT_FAILURE);
    }
    /* Initialize semaphore in value 1 - unlock */
    union semun suu;
    suu.val = 1;
    if(semctl(semid_file, 0, SETVAL, suu)) {
perror("semctl()");
exit(EXIT_FAILURE);
    }
Název: Re: Semafor a zastavení procesů
Přispěvatel: Kit 14. 12. 2010, 14:08:25
Snad mi autor odpustí, když se nad tím zamyslím trochu jinak...

Domnívám se, že udržování uživatelských kont v souboru není rozumné řešení a samotná nutnost použití explicitních zámků to dosvědčuje. Podle mne jsou ještě další 2 cesty:
- uživatelské jméno jako název souboru, atributy uvnitř. Zámky nebudou potřeba, dokud nebudu chtít manipulovat s jedním účtem z více míst současně. Různí uživatelé mohou paralelně bez omezení. Použití v souborovém systému typu B-stromu bude velmi rychlé i prostorově úsporné. Rozumně použitelné do několika desítek tisíc kont.
- databáze. Na podobné úkoly byly stavěny.
Název: Re: Semafor a zastavení procesů
Přispěvatel: Logik 15. 12. 2010, 16:05:02
Jo, rozhodně bych místo textového souboru použil databázi, klidně něco malého ko sqllite nebo embeded firebird. Nevýhoda ale je, že tydle jednoúčelové databáze jsou povětšinou jednouživatlské. To jde ale snadno vyřešit jedním centrálním správcem + komunikací např. pomocí UDP protokolu nebo třeba message queues (klient pošle do message queueu serveru zprávu s identifikací svojí message queue). Další možnost je thready a kritická sekce. Ale to by byl jiný program :-)

Dej si do lock a unlock logovací výpisy PID, Akce a stav semaforu (viz sem_getvalue). Možná Ti to napoví, kde je chyba, třeba něco omylem zamykáš dvakrát nebo tak.