Działanie operacji bitowych

Działanie operacji bitowych
DW
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:10
0

Witam. Na zajęciach z Podstaw systemów operacyjnych pisaliśmy mały programik korzystający głównie z funkcji stat. Częścią zadania było wyświetlenie uprawnień danego pliku. W internecie widziałem takie rozwiązanie i postanowiłem go użyć:

Kopiuj
 
printf("Atrybuty dostepu: ");
printf((statbuf.st_mode & S_IRUSR) ? "r" : "-");
printf((statbuf.st_mode & S_IWUSR) ? "w" : "-");
printf((statbuf.st_mode & S_IXUSR) ? "x" : "-");
printf((statbuf.st_mode & S_IRGRP) ? "r" : "-");
printf((statbuf.st_mode & S_IWGRP) ? "w" : "-");
printf((statbuf.st_mode & S_IXGRP) ? "x" : "-");
printf((statbuf.st_mode & S_IROTH) ? "r" : "-");
printf((statbuf.st_mode & S_IWOTH) ? "w" : "-");
printf((statbuf.st_mode & S_IXOTH) ? "x\n" : "-\n");

Wiem mniej więcej co robi dany kod, jednakże nie potrafię tego wyjaśnić od strony technicznej, a muszę to zrobić na najbliższych zajęciach. Wiem, że można te uprawnienia wyświetlić również w taki sposób

Kopiuj
 
printf("Atrybuty dostepu: %o\n", statbuf.st_mode);

i że sprawdzane są dane bity/bajty(?), ale prowadzący kazał mi to dosłownie rozrysować na kartce i nie bardzo wiem jak dokładnie narysować mu działanie tej operacji bitowej

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
1

Masz bity st_mode, masz flagę, np. S_IWOTH, która ma zapalony tylko jeden bit. Wykonujesz na nich and, wynikiem jest 0 lub S_IWOTH, co w C/C++ łatwo bezpośrednio interpretować jako true/false.


R1
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Postów:46
2

Jest dokładnie tak jak kolega napisał. Masz tutaj do czynienia z operacją bitową i instrukcją warunkową.

Jeżeli chodzi o opreację bitową:

statbuf.st_mode & S_IRUSR - st_mode może być tutaj np zmienna typu u8 (nie jestem pewien jaki typ ma ta zmienna), która zawiera 8 bitów. Każdy z bitów może być ustawiony lub też wyzerowany (odpowiednio TRUE, FALSE). Niech teraz np:

statbuf.st_mode = 0b00000010
S_IRUSR = 0b00000010
S_IWUSR = 0b00000001

operacja statbuf.st_mode & S_IRUSR to 0b00000010 & 0b00000010 = 0b00000010 <- Daje to TRUE
operacja statbuf.st_mode & S_IWUSR to 0b00000010 & 0b00000001 = 0b00000000 <- Daje to FALSE

Jeżeli chodzi o operację warunkową:

(statbuf.st_mode & S_IRUSR) ? "r" : "-" <- jest to inaczej x ? TRUE : FALSE. Jeżeli operacja bitowa da w wyniku TRUE, wtedy funkcja printf wyświetli Ci r. Jeżeli w wyniku operacji bitowej uzyskasz FALSE, wtedy funkcja printf wyświetli Ci -.

Czy jest to zrozumiałe dla Ciebie?

edytowany 2x, ostatnio: ravers_19
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:10 dni
1

Zakładam, że celem jest napisanie czegoś podobnego do https://github.com/put-poznan/mls (ja jestem autorem). Możesz się wzorować, masz tam plik src/printers.c, który powinien Ci bardziej rozjaśnić co się dzieje w mapach (bo nie używam stałych tylko bezpośrednio operuję na liczbach). Dokładniej funkcja, która wypisuje uprawnienia https://github.com/put-poznan/mls/blob/master/src/printers.c#L26-L37.


DW
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:10
0

Dziekuje za pomoc, juz wiem co i jak. Jeszcze tylko male pytanko - dlaczego w postaci oktagonalnej uprawnienia pokazuje mi jako 100640? Skad ta pierwsza jedynka?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.