Fájlrendszer kérdés

Rancz Lajos csiga at fosch.com
Fri May 19 10:28:48 CEST 2006


Rancz Lajos írta:
> Helló!
>
> Alapvetően csak az errno-val van gond. A POSIX 1. az errno-t egy 
> globális változónak definiálta, ami több szál esetén nyilván necces. A 
> POSIX 1.c már azt mondja, hogy szálanként kell megcsinálni az errno 
> változót, úgy hogy a többi szál ne láthassa: "POSIX.1c redefines errno 
> as a service that can access the per-thread error number as follows". Ez 
> most akkor mit jelent? Pl ezt:
> #define    errno    (ferror())
>   
Na ez nem jó, azt írja egy másik helyen, hogy:
|
#define errno <int modifiable lvalue> /
/
Tehát fv hívás nem lehet :-( Akkor viszont van más ötletem. Perpillanat 
a threadekhez tartozó fájlrendszer adatok a következőképpen vannak tárolva:

typdef struct
{
  xTaskHandle     currentProcess;         // Taszk
  unsigned int    workingDirectory;       // Szál munkakönyvtára

  // Temporary munkaterület
  PageHeader      work;                   // Szál temporary munkaterülete
} ThreadDescriptor;

Ha ennek van egy int errnum mezője, akkor a fv.-ek tehetik abba a 
threadhez tartozó hibát. Ekkor pedig az errno-t így lehet definiálni:

#define errno   (threads[actualThread()].errnum)

Az actualThread() fv. visszadja, hogy a hívó thread hányadik a táblában. 
Így minden szálnak saját errno-ja van, szóval nem kell mutex :-)

Üdv,
Lajos


//|
> Ez jól működik if(errno == vmi) esetben, de mi van olyankor, ha a szoft 
> pl. ilyet csinál:
> errno = 0;
>
> Teszünk rá?
>
> Kösz,
> Lajos
>
>
> Moczik Gabor írta:
>   
>> Rancz Lajos wrote:
>>   
>>     
>>> Visszatérve az újrahívhatóság kérdésére: nem teljsen értem, hogy két 
>>> szál hogyan tud egyszerre fájlokat elérni mert van statikus változó az 
>>> errno. Ebben az esetben mutexet kell használni az alaklmazói programba? 
>>> Csak a fájlrendszer fv. szintjén ezt nem lehet megoldani, pontosabban a 
>>> fv. végrehajtásának idejéig lehet, de onnatól semmi sem garantálható :-) 
>>> Hogy szokták ezt megoldani?
>>>     
>>>       
>> Igen, ehhez mutex kell. Minden esetben lockolni kell egy utasítás _blockot_, 
>> ha az ott használt objektumot mas szal is hasznalhatja ugyanabban az idoben.
>> Az "ugyanabban az idoben"-t ugy kell erteni, hogy ha taszkvaltas van, akkor 
>> kerulhet olyan helyre a vezerles a masik taszkban, ami hasznalja.
>>
>> Akkor is kell, ha pl. az iras/olvasas nem egy lepes, hanem tobb, mert a 
>> syscall-ok kozott mar lehet thread valtas.
>>
>>   
>>     
>
> -----------------------------------
>  Szponzorunk: http://tonerbolt.hu/
>
>   




More information about the Elektro mailing list