Bit Masking
o maskovaní bitov, operátory pre logický súčin a súčet
Záznam z prednášky
Introduction
- Dnes sa okrem nových vlastností a konštrukcií jazyka C naučíme aj niečo o operačnom systéme Linux. Tieto znalosti použijeme ako ilustračné pri predstavovaní nových jazykových konštrukcií, aby sme ich chápali jednoduchšie (dúfam). Každopádne sa máte na čo tešiť.
Filesystem Permissions
(slide) Začneme jednou zo základných znalostí každého linuxáka a síce - prístupovými právami pre súbory v súborovom systéme.
súbory v Linux-e
(slide prístupové práva
ich výpočet
ako zistím v jazyku C, či je súbor spustiteľný?
Bit Masking
Vytvoríme si pre potreby reprezentácie prístupových práv k súboru jednoduchý enumeračný typ. Aby sme nevymýšľali teplú vodu, inšpirujeme sa tým, ako táto reprezentácia vyzerá v knižnici
sys/stat.h
: (slide)enum permissions { = 4, // read by others S_IROTH = 2, // write by others S_IWOTH = 1 // execute by others S_IXOTH };
Následne je možné tento prístup využiť priamo v kóde pomocou binárnych operátorov pre logický súčet a súčin nasledovne:
pomocou logického súčtu viem vyskladať potrebnú hodnotu, napr. ak chcem, aby mal súbor práva súčasne na čítanie a spúšťanie, môže byť výsledná hodnota zapísaná takto:
int file_permission = S_IROTH | S_IXOTH;
čím súbor získa právo pre čítanie a spúšťanie ostatnými, pretože:
100 // S_IROTH OR 001 // S_IXOTH ------ 101 // S_IROTH | S_IXOTH
pomocou logického súčinu sa viem opýtať, či daná hodnota má nastavené príslušné bity, napr. si overím, či je súbor možné spúšťať (slide):
bool is_executable(int permissions){ if(permissions & S_IXOTH){ return true; }else{ return false; } };
pretože sa pýtam, či sa na danej pozícii nachádza príslušný bit alebo nie, čo vo výsledku dáva nulovú hodnotu (nemá príslušný bit nastavený) alebo nenulovú hodnotu (má príslušný bit nastavený):
101 // file permissions AND 001 // S_IXOTH ------- 001 // != 0 -> is executable
Tento spôsob sa nazýva aj Bit Masking, kedy:
- Pomocou bitového operátora
OR
nastavujeme bity na príslušných pozíciách. - Pomocou bitového operátora
AND
overujem bity na príslušných pozíciách.
- Pomocou bitového operátora