Witam, radząc się zgromadzonych tutaj użytkowników chciałbym napisać swoje zadanie. Nie zależy mi na gotowych odpowiedziach, raczej na doraźnej pomocy. Moja znajomość zagadnienia nie jest wcale na najwyższym poziomie, dlatego zakładam poniższy temat.
Do rzeczy:
W ramach projektu należy stworzyć uproszczoną wersję powłoki pracującej w systemie Linux, której minimalna funkcjonalność powinna obejmować:
1. Wbudowaną obsługę zmiennych środowiskowych, tzn. możliwość ustawiania i wyświetlania dowolnej zmiennej środowiskowej.
2. Wbudowane polecenie pwd wyświetlające aktualny katalog roboczy
3. Wbudowane polecenie cd pozwalające na zmianę katalogu roboczego. Polecenie powinno akceptować nazwy ścieżkowe. Wykonane bez argumentu powinno zmieniać katalog roboczy na katalog domowy użytkownika.
4. Wbudowane polecenie ls wyświetlające zawartość katalogu roboczego (jeżeli podane bez argumentów) lub dowolnego podanego jako argument.
5. Wbudowane polecenie ll odpowiadające poleceniu ls -l. Funkcjonalność jak w pkt 4.
6. Możliwość uruchomienia dowolnego programu poprzez podanie jego nazwy (ew. nazwy ścieżkowej).
Założenia do projektu:
1) Projekt ma być zrealizowany w języku C.
2) Musi działać w środowisku Linux.
3) Kompilacja nie powinna wymagać dodatkowych bibliotek – poza bibliotekami standardowymi dostarczonymi razem z dystrybucją.
4) Do kodu należy dołączyć plik konfiguracyjny Makefile lub skrypt powłoki o nazwie kompiluj.sh pozwalający na automatyczną kompilację całego projektu.
5) W projekcie należy wykorzystać niskopoziomowe funkcje oferowane przez system operacyjne (np. funkcje dostępu do katalogów i plików, funkcje fork/exec do uruchamiania programów itd.)
6) Nie wolno korzystać z funkcji wywołujących standardową powłokę (np. funkcja system).
7) Funkcje należy pogrupować w moduły (np. osobno operacje na katalogach, zmiennych środowiskowych, obsługa polecenia ls itd.).
Informacje dodatkowe:
Proponowana struktura:
Skrócony opis zadań komponentów:
Parser:
Analiza polecenia. Wywoływanie funkcji obsługujących poszczególne polecenia. Np.
- cmd_env (char* cmd line)
- cmd_pwd (char* cmd line)
- cmd_cd (char* cmd line)
- cmd_ls (char* cmd line)
- cmd_exec (char* cmd line)
Czyli jakkolwiek by to nie zabrzmiało - każda z funkcji obsługuje jedną funkcję. (env - zmienne środowiskowe, pwd - obsługa polecenia pwd, cd - obsługa polecenia cd, analogicznie pozostałe)
Proponowana lista poleceń rozumianych przez parser:
- set zmienna=wartość
- unset zmienna
- echo zmienna
- pwd
- cd ścieżka
- cd
- ls ścieżka
- ls
- ll ścieżka
- ll
- exec ścieżka
- quit/exit
Algorytm działania Parsera:
1. Wyświetl znak zachęty
2. Wczytaj linię
3. Rozpoznaj polecenie
4.Przekaż sterowanie do wybranej funkcji, bądź zamknij program (quit/exit)
5. Wróć do punktu 1
[przydatne funkcje: printf/cout, scanf/cin, fgets, strspy, strcmp, strncpm, stork]
Moduł env czyli manipulowanie zmiennymi środowiskowymi
Działanie:
1. Rozpoznanie polecenia
2. Wydobycie argumentów (nazwa, ewentualnie wartości zmiennych)
3. Wywołanie właściwej funkcji bibliotecznej
[przydatne funkcje: getenv, putenv, setenv, unsetenv, sscanf, printf, stork]
Moduł pwd czyli wyświetlenie katalogu roboczego
Działanie:
1. Wywołanie odpowiedniej funkcji bibliotecznej
[przydatne funkcje: getcwd, printf]
Moduł cd czyli zmiana katalogu roboczego
Działanie:
1. Sprawdzanie czy podany został argument
2. Jeżeli argument jest to wywołanie funkcji bibliotecznej
3. Jeżeli argumentu nie ma, to następuje pobranie zawartości zmiennej środowiskowej HOME i wywołanie funkcji bibliotecznej
[przydatne funkcje: chdir, sscanf, stork + możliwość wykorzystania modułu env]
Moduł ls czyli wyświetlanie zawartości katalogu
Działanie:
1. Określanie typu polecenia (krótki cyz długi format)
2. Sprawdzenie czy podany został argument
3. Jeżeli brak argumentu to pobranie zmiennej środowiskowej PWD
4. Otwarcie katalogu i kolejne odczytywanie pozycji w katalogu
5. Jeżeli długi format to odczytanie atrybutów każdej pozycji
6. Wyświetlenie informacji zgodnie z założonym formatem
7. Zamknięcie katalogu
[przydatne funkcje: opendir, readdir, closedir, stat, sscanf, strcmp, strcat, stork, printf]
Moduł exec czyli uruchomienie programu
Działanie:
1. Wyodrębnianie nazwy uruchamianego programu z polecenia
2. Rozwidlenie procesu (fork)
3. Proces macierzysty czeka na zakończenie potomka, a później kontynuuje działanie
4. proces potomny uruchamia podany program
[przydatne funkcje: sscanf, stork, fork, wait, waitpid, jedna z funkcji z rodziny exec]
Ok, to mamy już treść, mamy założenia lecimy dalej
Oto co przygotowałem sam, a co nie jest ani skończone ani poczęte ideą. W tym miejscu zabrakło mi już pomysłu na jakąkolwiek zmianę. Liczę na pomoc.
Dołączam gotowe już pliki *.c, *.h oraz makefile:
PACZUSZKA
Do rzeczy:
W ramach projektu należy stworzyć uproszczoną wersję powłoki pracującej w systemie Linux, której minimalna funkcjonalność powinna obejmować:
1. Wbudowaną obsługę zmiennych środowiskowych, tzn. możliwość ustawiania i wyświetlania dowolnej zmiennej środowiskowej.
2. Wbudowane polecenie pwd wyświetlające aktualny katalog roboczy
3. Wbudowane polecenie cd pozwalające na zmianę katalogu roboczego. Polecenie powinno akceptować nazwy ścieżkowe. Wykonane bez argumentu powinno zmieniać katalog roboczy na katalog domowy użytkownika.
4. Wbudowane polecenie ls wyświetlające zawartość katalogu roboczego (jeżeli podane bez argumentów) lub dowolnego podanego jako argument.
5. Wbudowane polecenie ll odpowiadające poleceniu ls -l. Funkcjonalność jak w pkt 4.
6. Możliwość uruchomienia dowolnego programu poprzez podanie jego nazwy (ew. nazwy ścieżkowej).
Założenia do projektu:
1) Projekt ma być zrealizowany w języku C.
2) Musi działać w środowisku Linux.
3) Kompilacja nie powinna wymagać dodatkowych bibliotek – poza bibliotekami standardowymi dostarczonymi razem z dystrybucją.
4) Do kodu należy dołączyć plik konfiguracyjny Makefile lub skrypt powłoki o nazwie kompiluj.sh pozwalający na automatyczną kompilację całego projektu.
5) W projekcie należy wykorzystać niskopoziomowe funkcje oferowane przez system operacyjne (np. funkcje dostępu do katalogów i plików, funkcje fork/exec do uruchamiania programów itd.)
6) Nie wolno korzystać z funkcji wywołujących standardową powłokę (np. funkcja system).
7) Funkcje należy pogrupować w moduły (np. osobno operacje na katalogach, zmiennych środowiskowych, obsługa polecenia ls itd.).
Informacje dodatkowe:
Proponowana struktura:
Skrócony opis zadań komponentów:
Parser:
Analiza polecenia. Wywoływanie funkcji obsługujących poszczególne polecenia. Np.
- cmd_env (char* cmd line)
- cmd_pwd (char* cmd line)
- cmd_cd (char* cmd line)
- cmd_ls (char* cmd line)
- cmd_exec (char* cmd line)
Czyli jakkolwiek by to nie zabrzmiało - każda z funkcji obsługuje jedną funkcję. (env - zmienne środowiskowe, pwd - obsługa polecenia pwd, cd - obsługa polecenia cd, analogicznie pozostałe)
Proponowana lista poleceń rozumianych przez parser:
- set zmienna=wartość
- unset zmienna
- echo zmienna
- pwd
- cd ścieżka
- cd
- ls ścieżka
- ls
- ll ścieżka
- ll
- exec ścieżka
- quit/exit
Algorytm działania Parsera:
1. Wyświetl znak zachęty
2. Wczytaj linię
3. Rozpoznaj polecenie
4.Przekaż sterowanie do wybranej funkcji, bądź zamknij program (quit/exit)
5. Wróć do punktu 1
[przydatne funkcje: printf/cout, scanf/cin, fgets, strspy, strcmp, strncpm, stork]
Moduł env czyli manipulowanie zmiennymi środowiskowymi
Działanie:
1. Rozpoznanie polecenia
2. Wydobycie argumentów (nazwa, ewentualnie wartości zmiennych)
3. Wywołanie właściwej funkcji bibliotecznej
[przydatne funkcje: getenv, putenv, setenv, unsetenv, sscanf, printf, stork]
Moduł pwd czyli wyświetlenie katalogu roboczego
Działanie:
1. Wywołanie odpowiedniej funkcji bibliotecznej
[przydatne funkcje: getcwd, printf]
Moduł cd czyli zmiana katalogu roboczego
Działanie:
1. Sprawdzanie czy podany został argument
2. Jeżeli argument jest to wywołanie funkcji bibliotecznej
3. Jeżeli argumentu nie ma, to następuje pobranie zawartości zmiennej środowiskowej HOME i wywołanie funkcji bibliotecznej
[przydatne funkcje: chdir, sscanf, stork + możliwość wykorzystania modułu env]
Moduł ls czyli wyświetlanie zawartości katalogu
Działanie:
1. Określanie typu polecenia (krótki cyz długi format)
2. Sprawdzenie czy podany został argument
3. Jeżeli brak argumentu to pobranie zmiennej środowiskowej PWD
4. Otwarcie katalogu i kolejne odczytywanie pozycji w katalogu
5. Jeżeli długi format to odczytanie atrybutów każdej pozycji
6. Wyświetlenie informacji zgodnie z założonym formatem
7. Zamknięcie katalogu
[przydatne funkcje: opendir, readdir, closedir, stat, sscanf, strcmp, strcat, stork, printf]
Moduł exec czyli uruchomienie programu
Działanie:
1. Wyodrębnianie nazwy uruchamianego programu z polecenia
2. Rozwidlenie procesu (fork)
3. Proces macierzysty czeka na zakończenie potomka, a później kontynuuje działanie
4. proces potomny uruchamia podany program
[przydatne funkcje: sscanf, stork, fork, wait, waitpid, jedna z funkcji z rodziny exec]
Ok, to mamy już treść, mamy założenia lecimy dalej
Oto co przygotowałem sam, a co nie jest ani skończone ani poczęte ideą. W tym miejscu zabrakło mi już pomysłu na jakąkolwiek zmianę. Liczę na pomoc.
Cytat:
env
Kod: C / C++
env - nagłówek
Kod: C / C++
Cytat:
pwdKod: C / C++
pwd - nagłówekKod: C / C++
Cytat:
cdKod: C / C++
cd - nagłówekKod: C / C++
Cytat:
lsKod: C / C++
ls - nagłówek
Kod: C / C++
Cytat:
execKod: C / C++
exec - nagłówekKod: C / C++
Cytat:
llKod: C / C++
ll - nagłówekKod: C / C++
Cytat:
mainKod: C / C++
main - nagłówekKod: C / C++
Cytat:
makefile
Kod: C / C++
Dołączam gotowe już pliki *.c, *.h oraz makefile:
PACZUSZKA