Semafor a zastavení procesů

charlie

Semafor a zastavení procesů
« kdy: 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);
    }
}
« Poslední změna: 14. 12. 2010, 07:16:05 od Petr Krčmář »


kagro

Re: Semafor a zastavení procesů
« Odpověď #1 kdy: 14. 12. 2010, 07:19:12 »
Zdravim,

nevidim nikde vytvorenie semafora, je dobre inicializovany?

charlie

Re: Semafor a zastavení procesů
« Odpověď #2 kdy: 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);
    }

Kit

Re: Semafor a zastavení procesů
« Odpověď #3 kdy: 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.

Logik

  • *****
  • 1 044
    • Zobrazit profil
    • E-mail
Re: Semafor a zastavení procesů
« Odpověď #4 kdy: 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.