Bit Masking

Bit Masking

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

  • 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 {
        S_IROTH = 4,    // read by others
        S_IWOTH = 2,    // write by others
        S_IXOTH = 1     // execute by others
    };
  • 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.