Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Powłoka w Linuksie - poziom średnio-zaawansowany

kesztyn 15 Cze 2011 02:13 2828 8
  • #1 15 Cze 2011 02:13
    kesztyn
    Poziom 8  

    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:
    [C] Powłoka w Linuksie - poziom średnio-zaawansowany

    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
    Zaloguj się, aby zobaczyć kod


    env - nagłówek

    Kod: c
    Zaloguj się, aby zobaczyć kod





    Cytat:



    pwd
    Kod: c
    Zaloguj się, aby zobaczyć kod


    pwd - nagłówek
    Kod: c
    Zaloguj się, aby zobaczyć kod










    Cytat:

    cd
    Kod: c
    Zaloguj się, aby zobaczyć kod


    cd - nagłówek
    Kod: c
    Zaloguj się, aby zobaczyć kod





    Cytat:


    ls
    Kod: c
    Zaloguj się, aby zobaczyć kod

    ls - nagłówek

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Cytat:

    exec
    Kod: c
    Zaloguj się, aby zobaczyć kod


    exec - nagłówek
    Kod: c
    Zaloguj się, aby zobaczyć kod




    Cytat:

    ll
    Kod: c
    Zaloguj się, aby zobaczyć kod

    ll - nagłówek
    Kod: c
    Zaloguj się, aby zobaczyć kod






    Cytat:


    main
    Kod: c
    Zaloguj się, aby zobaczyć kod



    main - nagłówek
    Kod: c
    Zaloguj się, aby zobaczyć kod





    Cytat:

    makefile

    Kod: c
    Zaloguj się, aby zobaczyć kod






    Dołączam gotowe już pliki *.c, *.h oraz makefile:

    PACZUSZKA

    1 8
  • #2 15 Cze 2011 08:43
    Dariusz Bismor
    Poziom 17  

    Po pierwsze, jak widzę zdecydowałeś się pisać w C (nie C++), więc zmień tytuł by nie wprowadzać w błąd.
    Po drugie, jakiej konkretnie pomocy oczekujesz? Moim zdaniem radzisz sobie dobrze, a w tym natłoku danych, które podałeś, trudno zauważyć to, czego nie potrafisz zrobić i gdzie Ci pomóc.

    Dariusz

    0
  • #3 15 Cze 2011 08:50
    kesztyn
    Poziom 8  

    Otóż nie wiem co zrobić dalej. Nie mam pomysłu na rozwój tego projektu. Za co się teraz zabrać. Potrzebuję przedszkolanki która mnie poprowadzi za rączkę i powie co dalej i dlaczego tak a nie inaczej.
    Zabieram się za edycję.

    0
  • #4 15 Cze 2011 09:51
    Dariusz Bismor
    Poziom 17  

    Wybacz, ale dalej chyba nie rozumiem.
    Poza oczywistą poprawą kodu polecenia "ll" tak, by wyświetlało więcej informacji o plikach (liczba dowiązań, właściciel, grupa, itd) oraz dopisaniem kodu do polecenia exec tak, by uruchamiało program podany w żądaniu, dalszy możliwy rozwój - co też wydaje się oczywiste - to obsługa przełączników w poleceniu ls oraz dodawanie kolejnych poleceń, np mkdir, rmdir, rm, touch, itd. - także z przełącznikami.

    HTH,
    Dariusz

    0
  • #5 15 Cze 2011 20:36
    kesztyn
    Poziom 8  

    Oczywiście masz rację. Podajesz konkretne rzeczy, które trzeba zrobić. Ale ostatecznie - moim problemem jest to, że nie wiem jak dalej kod poprowadzić. Do każdego z tych modułów. Czasami potrzeba jakiegoś akapitu kodu, żeby było się o co zaczepić i dostać pary, na której będize się dalej kombinowało. Exec'a mam praktycznie pustego. W ogóle nie wiem co powinienem w nim umieścić do czego się odwołać. Wiem że to już nie jest Hello Word, dlatego tak dokładnie wszystko omówiłem.

    0
  • #6 15 Cze 2011 21:51
    loganek2
    Poziom 16  

    kesztyn, proponuję abyś najpierw poprawił błędy w programie. odruchowo nacisnąłem po prostu enter nie wpisując żadnego polecenia i... naruszenie ochrony pamięci.

    0
  • #7 15 Cze 2011 21:54
    kesztyn
    Poziom 8  

    Jakaś propozycja na solucję tego:
    0. Znak zachęty
    1. Jeżeli dostaniesz enter, ale będzie brak polecenia patrz punkt 0?

    Coś w tym kierunku?

    0
  • Pomocny post
    #8 15 Cze 2011 22:05
    loganek2
    Poziom 16  

    no właśnie coś w tym stylu. proponuję jeszcze coś takiego, że jeśli do polecenia poda się niewłaściwy argument, to albo wyświetl pomoc do tego polecenia, albo zignoruj argument i pracuj tak jak go nie było. Przyklad: ls -l

    0
  • Pomocny post
    #9 16 Cze 2011 11:27
    Dariusz Bismor
    Poziom 17  

    Twoja odpowiedź mnie zaskoczyła: przy tak dobrze napisanym kodzie nie wiesz, jak wypełnić te kilka miejsc? A od czego manual (bo zakładam, że skoro piszesz dla Linuxa, to masz go gdzieś zainstalowany)? Polecenie 'man 3 exec' podpowie Ci, jak dokończyć funkcję exec. Z kolei 'man 2 stat' pokaże Ci budowę struktury 'stat', która jest zwracana przez wywołanie funkcji 'stat()' na ścieżce do pliku.

    HTH,
    Dariusz

    0