Strona 1 z 1
[C] uproszczona powłoka
: 22 cze 2011, 21:59
autor: lolq
mam takie zadanie:
W ramach projektu należy stworzyć uproszczoną wersję powłoki pracującej w systemie Linux.
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).
do weekendu muszę mieć gotowe, a mam jedynie polecenie ls wyświetlające listę katalogów, nie mam zbytnio pojęcia jak resztę dodać, nawet ze 2 jakieś polecenia inne, jak to złożyć w całość? Może ktoś pomóc?
Re: [C] uproszczona powłoka
: 22 cze 2011, 22:18
autor: karmelek
To jest jakieś zadanie domowe czy komercyjna oferta?
Re: [C] uproszczona powłoka
: 22 cze 2011, 22:22
autor: mario_7
Konkrety - co zrobiłeś i w którym miejscu masz problem (w sensie - w kodzie źródłowym)?
Forum nie jest od rozwiązywania zadań domowych, więc jeśli nie sprecyzujesz problemu, to temat wyląduje w koszu.
Re: [C] uproszczona powłoka
: 22 cze 2011, 23:05
autor: lolq
to jest zadanie z systemów na studia
to mam:
Kod: Zaznacz cały
#include <dirent.h>
#include <stdio.h>
int main(void)
{
char komenda[100];
scanf("%s",komenda);
if(strcmp(komenda,"ls")==0)
{
DIR *d;
struct dirent *dir;
d = opendir(".");
if (d)
{
while ((dir = readdir(d)) != NULL)
{
printf("%s\n", dir->d_name);
}
closedir(d);
}
}
else
{
printf("Blad!\n");
}
return(0);
}
teraz nie wiem jak do tego dodać inne polecenia dodałem też jak widać porównanie stringów, po wpisaniu "ls" wyświetla listę katalogów w aktualnym folderze, po wpisaniu czegoś innego błąd, fakt to działa, ale nie bardzo się orientuję też jak mogło by to wyglądać przy innych poleceniach, mam do każdego od nowa dawać string?
Re: [C] uproszczona powłoka
: 22 cze 2011, 23:30
autor: karmelek
1. Zdekomponować problem.
2. Do zmiennych środowiskowych zaimplementowałbym sobie listę jednokierunkową z prostym interfejsem rtypu serarch, add, remove.
3. Do przechowywania dostępnych poleceń jw, ewentualnie jakaś tablica stringów - jeden czort.
4. Wszystki operacje plikowe jakie tu masz są do znalezienia w google - sprawdziłem właśnie.
Re: [C] uproszczona powłoka
: 23 cze 2011, 19:00
autor: lolq
no to jak znalazłeś to możesz podać?
właśnie w tym sęk, że ja nie znalazłem i po to też temat założyłem...
jeśli bym miał każdego polecenia kod to jakoś myślę bym to sklecił w kupę ;]
Re: [C] uproszczona powłoka
: 23 cze 2011, 19:44
autor: karmelek
Erm, to jakieś studia są? To zadanie naprawdę nie jest trudne, wystarczy odrobina chęci. Programowanie i nauka zazwyczaj nie polega na kopiowaniu kodu "skądś" tylko na tworzeniu własnego.
1. Wbudowaną obsługę zmiennych środowiskowych, tzn. możliwość ustawiania i wyświetlania
dowolnej zmiennej środowiskowej.
http://pl.wikipedia.org/wiki/Lista
2. Wbudowane polecenie pwd wyświetlające aktualny katalog roboczy
Zakładając, że katalog roboczy przechowujemy w zmiennej to nie widzę problemu z wyświetleniem tego.
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.
Sam piszesz ze już to masz.
5. Wbudowane polecenie ll odpowiadające poleceniu ls l.
jw. Tylko inny format wyjścia.
6. Możliwość uruchomienia dowolnego programu poprzez podanie jego nazwy (ew. nazwy ścieżkowej).
Zależnie od systemu - funkcje systemowe się kłaniają.
W których miejscach w kodzie masz problemy?
Re: [C] uproszczona powłoka
: 24 cze 2011, 20:57
autor: lolq
tak, studia informatyczne, chęci są (ale entuzjazm opadł) właśnie w momencie gdy doczytałem dalszą treść, że nie można korzystać z funkcji systemowych, jeśli by można do standardowej powłoki się odwoływać to nie byłby to problem, a tu trzeba od podstaw (wcześniej tego nie napisałem)
Re: [C] uproszczona powłoka
: 24 cze 2011, 21:40
autor: karmelek
lolq pisze:tak, studia informatyczne, chęci są (ale entuzjazm opadł) właśnie w momencie gdy doczytałem dalszą treść, że nie można korzystać z funkcji systemowych, jeśli by można do standardowej powłoki się odwoływać to nie byłby to problem, a tu trzeba od podstaw (wcześniej tego nie napisałem)
Hmmm, dla mnie to oczywiste było

Nie wiem, jakoś czuję, że na pierwszym roku bym to spokojnie zaklepał, ale nie w środku sesji, bo już na kod nie mogę patrzeć:P
Re: [C] uproszczona powłoka
: 24 cze 2011, 21:57
autor: ethanak
lolq pisze:nie można korzystać z funkcji systemowych
E... że na pewno? A nie że nie można korzystać z funkcji
system?
Podobnie brzmi...
Jakoś sobie nie wyobrażam napisania czegokolwiek shellopodobnego bez pipe i exec*... ale ja to mam taką słaba wyobraźnię...
Re: [C] uproszczona powłoka
: 24 cze 2011, 22:04
autor: karmelek
W ogóle - rzuć to zadanie w pełnym brzmieniu, chętnie dla wprawki po sesji sobie zaklepię.
Re: [C] uproszczona powłoka
: 24 cze 2011, 22:23
autor: lolq
zgadza się , funkcji system, sorry za wprowadzenie w błąd

tylko to zadanie jest mi potrzebne na jutro xD
Re: [C] uproszczona powłoka
: 24 cze 2011, 22:24
autor: karmelek
Dopisałeś coś nowego>
Re: [C] uproszczona powłoka
: 24 cze 2011, 22:56
autor: lolq
niestety nie, bo w międzyczasie robię też jeszcze jakąś prezentację śmieszną potrzebną do zaliczenia innego bajzlu, tą powłokę teoretycznie powinniśmy robić w grupach 2-3 osobowych, ale to teoretycznie... w praktyce jest tak, że ja się staram (raczej marnie, ale przynajmniej coś próbuję pisać i wychodzić z inicjatywą o pomoc) a kolega nie potrafi kompletnie nic, szkoda
edit:
dorobiłem pwd:
Kod: Zaznacz cały
#include <stdio.h>
#include <unistd.h>
main()
{
void pwd();
char katalog[200];
getcwd(katalog,200);
puts(katalog);
return 0;
}
tylko jak to ładnie na pliki oddzielne podzielić i dodać porównanie stringów by po wpisaniu komendy wykonywało to co powinno a przy błędnej komendzie wyświetlało błąd? bo obecnie mam to w dwóch plikach *.c do tego w pierwszym porównanie stringów nie działa tak jak powinno bo zamiast po wykonaniu (bądź nie wykonaniu) polecenia przejść do kolejnej linii ze znakiem zachęty, program się kończy