dkozykowski / OS-Files-Indexer

Operating Systems course project at WUT

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Systemy Operacyjne 1: Projekt Indeksowanie plików w katalogach

License: MIT

1 Zarys projektu

W ramach projektu ma powstać program, który: przechodzi wszystkie pliki w zadanym katalogu i podkatalogach, tworzy w pamięci strukturę danych zawierającą potrzebne dane o tych plikach, a następnie czekający na komendy będące zapytaniami o dane zawarte w tej strukturze. Aby nie przeglądać za każdym razem całego katalogu, cała struktura danych jest zapisywana do pliku i wczytywana w kolejnych wywołaniach programu. Strukturę danych opisującą zawartość katalogów będziemy nazywać indeksem.

Pewne operacje muszą odbywać w oddzielnych wątkach i jest to zaznaczone w treści zadania. Nie można z tych wątków zrezygnować. Można jednak tworzyć wątki, których treść zadania nie narzuca, jeśli jest taka potrzeba.

2 Wywołanie i parametry

Powinien powstać jeden program o nazwie mole, który przyjmuje następujące parametry wywołania:

-d sciezka
ścieżka do katalogu, który będzie przeglądany. W przypadku, gdy opcja nie jest podana, zamiast tego wykorzystywana jest ścieżka wskazywana przez zmienną środowiskową $MOLE_DIR. Jeśli zmienna nie jest ustawiona, to wyświetlany jest błąd wywołania i program się kończy. Ostateczna wartość tego parametru będzie dalej oznaczona path-d.
-f sciezka
ścieżka do pliku, z którego będzie czytany/zapisywany indeks. Jeśli opcja nie jest podana, to zamiast tego wykorzystywana jest ścieżka wskazywania przez zmienną środowiskową $MOLE_INDEX_PATH. Jeśli zmienna nie jest ustawiona, to domyślną wartością jest plik .mole-index w katalogu domowym użytkownika. Ostateczna wartość tego parametru będzie dalej oznaczona path-f.
-t n
gdzie n to liczba całkowita z przedziału <30, 7200>. Jest to czas przerwy w sekundach pomiędzy kolejnymi przebiegami indeksowania katalogu opisanymi dalej. Ta opcja jest opcjonalna, jeśli nie jest podana, to periodyczne uruchamianie indeksowania jest wyłączone. Wartość parametru będzie dalej oznaczona jako t.

3 Działanie programu

Po uruchomieniu program próbuje otworzyć plik path-f i jeśli ten istnieje, czyta z niego indeks katalogu. W przeciwnym przypadku uruchamia procedurę indeksowania opisaną dalej. Następnie przechodzi do oczekiwania na komendy wpisywane na stdin przez użytkownika.

3.1 Procedura indeksowania

Indeks ma zbierać informacje o następujących typach plików:

  • katalogi,
  • obrazy JPEG,
  • pliki PNG,
  • pliki skompresowane gzipem,
  • pliki skompresowane zipem, w tym wszystkie pliki typu docx, odt i inne, które korzystają z formatu zip.

Rozpoznawanie typu pliku ma się odbywać na podstawie odczytu sygnatury pliku (tzw. magic number), a nie na podstawie rozszerzenia. Wszystkie pozostałe typy plików są w indeksie pomijane.

Indeks ma przechowywać następujące informacje:

  • nazwę pliku,
  • pełną ścieżkę,
  • rozmiar,
  • uid właściciela,
  • typ (jeden z wyżej wymienionych).

Procedura indeksowania polega na uruchomieniu pojedynczego wątku, który w pierwszej kolejności czyści strukturę indeksu, a następnie sprawdza wszystkie pliki w katalogu path-d i podkatalogach. Dla każdego z plików wykonuje sprawdzenie. czy typ pliku należy do typów, które indeksujemy i jeśli tak jest, zapisuje wymienione dane pliku do indeksu. Na koniec zapisuje indeks do pliku path-f.

Po zakończeniu indeksowania, które dzieje się zawsze w tle (w oddzielnym wątku), na stdout wypisywany jest komunikat o zakończeniu działania.

3.2 Dostępne komendy

Przetwarzanie komend ma działać możliwie równolegle z indeksowaniem. Nie jest dopuszczalne, żeby w trakcie potencjalnie długiego indeksowania, dostęp do zapytań był zablokowany. Natomiast dopuszcza się sytuację, gdy odpowiedzi na zapytania są na bazie starych danych, jeśli nowe indeksowanie jeszcze się nie zakończyło.

Program ma oczekiwać na kolejne linie z stdin. Każda linia powinna zawierać jedną z podanych komend. Jeśli wejście od użytkownika nie jest poprawną komendą wyświetlany jest błąd i program oczekuje na kolejne wejście.

Komendy:

exit
rozpoczyna procedurę kończenia programu – program przestaje przyjmować kolejne komendy, jeśli aktualnie jakaś operacja indeksowania jest w toku, to program czeka na jej zakończenie (w tym na zapisanie wyniku indeksowania do pliku), po czym cały program kończy się.
exit!
szybkie kończenie programu – program przestaje przyjmować komendy. Jeśli trwa proces indeksowania, jest on przerywany. Jeśli trwa zapis wyniku indeksowania do pliku, to zapis zostaje dokończony (niedopuszczalne jest pozostawienie pliku indeksu w niespójnym stanie). Potem program się kończy.
index
jeśli w danej chwili nie trwa indeksowanie, to uruchamia w tle indeksowanie katalogu path-d i natychmiast zaczyna oczekiwać na kolejną komendę z stdin. Jeśli w danej chwili indeksowanie jest w toku, to wyświetla komunikat z tą informacją i nie powoduje żadnych dodatkowych akcji.
count
przechodzi po całym indeksie i wylicza ile jest plików poszczególnych typów i wypisuje tę informację na stdout w formie prostej tabeli
largerthan x
x jest żądanym rozmiarem pliku. Przechodzi po indeksie i wypisuje na stdout informacje: pełna ścieżka, rozmiar, typ na temat wszystkich plików, których rozmiar jest większy od podanego x
namepart y
y jest fragmentem nazwy pliku, potencjalnie zawierającym spacje. Przechodzi po indeksie i wypisuje wszystkie wpisy, gdzie y jest fragmentem nazwy pliku. Wypisuje te same informacje o plikach, co largerthan.
owner uid
uid jest identyfikatorem użytkownika. Przechodzi indeks i wypisuje na stdout, w tym samym formacie, co poprzednio, pliki, których właścicielem jest podany użytkownik.

3.2.1 Stronicowanie danych

Jeśli którakolwiek z komend largerthan, namepart, owner, będzie wypisywać więcej niż 3 rekordy, należy dostarczyć użytkownikowi możliwość przewijania wyników. W tym celu należy skorzystać ze zmiennej środowiskowej $PAGER. Jeśli zmienna środowiskowa $PAGER nie jest ustawiona lub wynik zawiera nie więcej niż trzy rekordy, to po prostu wypisujemy znalezione rekordy na stdout. W przeciwnym przypadku, należy uruchomić program o nazwie wskazywanej przez zmienną pager z użyciem funkcji popen i do uzyskanego strumienia plikowego, który będzie standardowym wejściem uruchomionego programu, wypisywać kolejne rekordy. Na koniec zamknąć strumień i zaczekać na proces potomny z użyciem pclose.

Funkcje popen i pclose nie były omówione na zajęciach, należy samodzielnie uzyskać informacje na temat ich działania.

Przykładową wartością zmiennej $PAGER może być less. Wtedy to przewijania wyników będzie użyty właśnie program less.

3.3 Struktura danych

Struktura danych realizując indeks nie jest narzucona, można używać dowolnych struktur, w tym tablic, drzew, list. Projektując strukturę należy wziąć pod uwagę to, że będzie ona odczytywana i zapisywana z/do pliku, więc stosowanie np. wskaźników niesie ze sobą dodatkowe komplikacje.

Można założyć, że długości nazw plików i ścieżek są ograniczone. W takim przypadku w trakcie indeksowania wykrywać, gdy nazwy są zbyt długie i wypisywać komunikat ostrzegawczy (bez przerywania programu). Limity długości muszą być łatwe do skonfigurowania na etapie kompilacji.

3.4 Zapis i odczyt pliku

Zapis i odczyt pliku indeksu tylko z użyciem niskopoziomowych operacji na plikach. Dodatkowo nie wolno bez potrzeby dokonywać konwersji liczb, czy innych bytów na napisy, a zapisywać je binarnie. Nie jest wymagane, aby zapisane pliki dało się przenosić między architekturami (czyli nie są problemem różnice w takich rzeczach jak: długości typów, kolejność bajtów w liczbie, wyrównanie pól struktur).

3.5 Indeksowanie w tle

Jeśli program został uruchomiony w parametrem t, uruchamiany jest wątek, który uruchamia ponowne indeksowanie katalogu path-d, jeśli ostatnie indeksowanie zostało wykonane więcej niż t sekund temu. Czas ostatniego indeksowania uwzględnia zarówno indeksowanie na starcie programu, jeśli wystąpiło, indeksowanie zapoczątkowane komendą użytkownika oraz indeksowanie inicjowane po przekroczeniu czasu t. W przypadku, gdy program został uruchomiony i istniał już plik z indeksem, to za czas ostatniego indeksowania przyjmujemy datę modyfikacji pliku z indeksem (to może oznaczać uruchomienie indeksowania tuż po starcie programu).

4 Ograniczenia

Do operacji na pikach należy zastosować niskopoziomowe funkcje IO POSIX. Do operacji na stdin, out, err można użyć buforowanych funkcji ze standardowego C.

About

Operating Systems course project at WUT


Languages

Language:C 93.8%Language:Makefile 6.2%