Działanie operacji bitowych

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ć:

 
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

 
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

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.

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?

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.

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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1