Instrukcja do laboratorium Systemów Operacyjnych w
Ć iczenie pierwsze
Temat: Wprowadzenie do edytora vim, kompilatora gcc, podr c
ę znika man i systemu operacyjnego Linux
Opracowanie:
mgr inż. Arkadiusz Chrobot
1. Edytor VIM
Edytor tekstowy VIM jest rozbudowaną wersją edytora VI, najstarszego i naj-bardziej rozpowszechnionego w środowiskach uniksowych edytora przeznaczo-nego dla programistów. Mimo na pozór trudnej do opanowania obsługi stanowi on bardzo elastyczne i wygodne środowisko dla programisty. VIM dzia a ł
w trzech trybach: edycji, wprowadzania i polece .
ń W trybie edycji kursorem
można poruszać przy pomocy klawiszy <h>, <j>, <k>, <l>, jak również posługu-jąc się klawiszami kursorów. W tym trybie niektórym klawiszom, lub ciągom wpisanym przy pomocy klawiatury przypisano działania zwi zane ą
z operacjami
na tek cie. Oto kilka najwa
ś
niejszych przyk
ż
adów:
ł
yy – kopiuje do bufora linię tekstu pod któr znajduje si ą
kursor,
ę
y10y – kopiuje do bufora 10 linii tekstu zaczynaj c od tej pod któr ą
znajduje si
ą
ę
kursor (zamiast 10 mo e wyst
ż
pi
ą
inna liczba)
ć
p – wkleja tekst z bufora do miejsca, w którym znajduje się kursor, 10p – robi to co p, tylko 10 razy (zamiast 10 mo e wyst ż
pi
ą ć inna liczba),
dd - usuwa lini tekstu
ę
pod którą znajduje się kursor (można ją wkleić klawiszem p w inne miejsce),
d10d - tak jak wy ej, ale 10 linii, (zamiast 10 mo ż
e wyst
ż
pi
ą
inna liczba)
ć
x – kasuje znak pod którym znajduje się kursor (uwaga: pięć znaków można skasowa poleceniem 5x),
ć
u – polecenie cofni cia ostatniej zmiany (ang. undo) - jest wielopoziomowe, ę
yw – skopiowanie wyrazu do bufora,
dw – usuni cie wyrazu,
ę
cw – usuni cie wyrazu i przej
ę
cie do trybu wprowadzania,
ś
a – przesuni cie
ę
kursora o jedną pozycję w prawo i przej cie
ś
do trybu wprowa-
dzania,
i – przej cie do trybu wprowadzania,
ś
r – zmiana jednego znaku,
R – przej cie
ś
do trybu wprowadzania z nadpisywaniem (podobnie dzia a ł klawisz
insert),
* - wyszukanie kolejnego wyst pienia wzorca znajduj ą
cego si
ą
pod kursorem,
ę
2
K – wyszukanie strony podręcznika man, dla instrukcji pod którą znajduje się kursor,
== - formatuje wci cie pojedynczego wiersza kodu, ę
=G – formatuje wcięcia kodu pocz wszy
ą
od bieżącego po o
ł
enia
ż
kursora do
ko ca,
ń
gg – umieszcza kursor na pocz tku pliku z kodem/tekstem, ą
G – umieszcza kursor na końcu pliku z kodem/tekstem.
Tryb wprowadzania, jak sama nazwa wskazuje służy do wprowadzania tekstu programu (kodu źródłowego). Edytor VIM oferuje wiele udogodnień u a ł -
twiaj cych
ą
pracę programisty, jak pod wietlanie
ś
sk adni,
ł
czy numerowanie li-
nii. Niektóre z nich trzeba uaktywnić w trybie polece , ń jednak część z nich do-st pna
ę
jest poprzez odpowiednie kombinacje klawiszy np: <Ctrl> + <p> uzupe-
łnienie wprowadzanego wzorca poprzez dopasowanie go do wzorca znajdującego się „u góry”, <Ctrl> + <n> to samo co poprzednio, ale wzorzec znajduje się „na dole”, <Ctrl> + <W> przejście mi dzy ę
otwartymi oknami, <Esc> przejście do try-bu edycji. W trybie poleceń dostępne są następujące opcje:
/wzorzec – znajduje wystąpienie wzorca w pliku, przeszukiwanie „w dół”,
?wzorzec – jak wyżej, ale „w górę”,
!polecenie – wykonanie polecenia pow oki,
ł
:q – wyj cie z edytora,
ś
:q! - wyj cie z edytora, bez zapisywania zmian, ś
:wq – wyj cie z zapisaniem zmian,
ś
:sp – podzielenie bie
cego okna na dwie cz
żą
ci,
ęś
:e nazwapliku – otwarcie pliku do edytowania,
:s/wzorzec/zastąpienie – zastąpienie wzorca podanym ciągiem w linii, w której znajduje si kursor
ę
,
:%s/wzorzec/zastąpienie – to samo co wy ej, ale dla ca ż
ego pliku,
ł
:%s/wzorzec/zast pienie
ą
/g – to samo co wy ej,
ż
ale również dla ka dego
ż
wy-
st pienia wzorca w wierszu,
ą
:set number – w czenie numeracji wierszy,
łą
:set nonumber – wy czenie numeracji wierszy,
łą
:tabnew – otworzenie nowej karty (od wersji 7.0),
:tabnext – przej cie do nast
ś
pnej karty (od wersji 7.0),
ę
3
:tabprev – przej cie do poprzedniej karty (od wersji 7.0), ś
:10 – przeniesienie kursora do wiersza o podanym numerze,
:make – wykonanie kompilacji bez opuszczania edytora, o ile istnieje plik makefile,
:cnext – wyszukanie kolejnego b du w kodzie, je łę
li kompilacja si
ś
ę nie powiodła,
:cprevious – to co wy ej, ale poprzedniego b
ż
du,
łę
:clist – wypisuje skrócon list
ą
b
ę
dów,
łę
:clist! - wypisuje pe n
ł
list
ą
b
ę
dów.
łę
Część z tych poleceń mo e
ż zostać automatycznie wykonana po uruchomieniu VIMa, je li zostan
ś
zapisane w pliku
ą
.vimrc. Oto przykładowy taki plik:
set nocp
"wy cz tryb kompatybilno
łą
ci z VI
ś
set nowrap
"wy cz zawijanie wierszy
łą
set autoindent shiftwidth=8 "ustaw g boko łę
wci
ść
na 8 znaków
ęć
set showcmd "pokaż komendy wpisywane w trybie edycji map <F2> :set nowrap<cr> "zmapuj klawisze F2 – wyłącz zawijanie wierszy map <F3> :set wrap<cr> "F3 – włącz zawijanie wierszy map <F4> :set number<cr> "F4 – włącz numeracje wierszy map <F5> :set nonumber<cr> "F5 – wy cz numeracje wierszy łą
map <F6> :set showmatch<cr> "F6 – włącz parowanie nawiasów1
map <F7> :set noshowmatch<cr> "F7 – wy cz parowanie nawiasów łą
2. Podr c
ę znik man
Podr cznik
ę
man zawiera opisy poleceń powłoki, oraz funkcji języka C. Składnia wywo ania
ł
jest następująca: man nazwa polecenia. W przypadku, kiedy istnieje zarówno funkcja, jak i polecenie o takiej samej nazwie, to nale y ż podać jeszcze
stron podr
ę
cznika, np.:
ę
man 3 printf.
3. Kompilator gcc i inne narz d
ę zia do tworzenia programów
Kompilator gcc jest tak naprawdę zbiorem kompilatorów stworzonym przez or-ganizację GNU. Kompilator ten wywołuje się podając mu argumenty w linii polece .
ń W najprostszym przypadku wystarczy napisać: gcc nazwa.c, ale za-lecanym sposobem jest: gcc -Wall -o nazwa nazwa.c, gdzie flaga -o oznacza na-zwę zbioru wynikowego, a flaga -Wall nakazuje włączenie wszystkich ostrze e ż
.
ń
1 W tym trybie, je l
ś i stawiamy nawias zamykaj c
ą y, to kursor na sekundę wraca do nawiasu
otwieraj c
ą ego
4
ś
powy sze
ż
wywołanie mo e
ż przyjąć formę bardziej z o
ł
on
ż
.
ą W takim
wypadku, aby uniknąć wielokrotnego wpisywania długich poleceń mo emy ż
się
posłu y
ż ć programem o nazwie make. Aby to uczynić nale y ż przygotować plik
o nazwie makefile w katalogu, w którym znajdują się ród ź
a
ł
programu. Treść
takiego pliku tworzymy według nast puj
ę
cego
ą
schematu (linie zaczynające się
od „#” stanowi komentarz):
ą
regu a: regu
ł
a1 regu
ł
a2
ł
#po nazwie regu y umieszczamy opis wymaga
ł
ń
akcja
#Pusty wiersz
regu a1:
ł
akcja
#Pusty wiersz
regu a2:
ł
akcja
Z powy szego
ż
przyk adu
ł
wynika, że wymagania co do reguł są opcjonalne i nie-koniecznie musimy je wypisywa .
ć Domyślnie wykonywana jest pierwsza za-
deklarowana w pliku regu a.
ł
Możliwa jest również deklaracja na pocz tku
ą
pliku
pewnych sta ych
ł
do których się b dziemy
ę
odwoływać poprzedzając je znakiem
dolara. Oto przyk ad rozbudowanego pliku makefile: ł
CC = gcc #stała oznaczająca nazw kompilatora ę
OFLAGS = -Wall -O2 -o #stała przechowująca flagi wywołania kompilatora
#Pusty wiersz
all: primitive primitive16 check_prim check_prim_16
#Pusty wiersz
#Pusty wiersz
primitive:primitive.c #Regu a primitive wymaga pliku primitive.c by zadzia ł
łać
$(CC) $(OFLAGS) primitive primitive.c
#Pusty wierz
primitive16:primitive16.c
$(CC) $(OFLAGS) primitive16 primitive16.c
#Pusty wiersz
check_prim:check_prim.c
$(CC) $(OFLAGS) check_prim check_prim.c
5
check_prim_16:check_prim_16.c
$(CC) $(OFLAGS) check_prim_16 check_prim_16.c
#Pusty wiersz
clean:
rm -f *~
rm -f core*
#Pusty wiersz
cleanprimitive:
rm -f *~
rm -f core*
rm -f primitive
#Pusty wiersz
cleanprimitive16:
rm -f *~
rm -f core*
rm -f primitive16
cleancheck_prim:
rm -f *~
rm -f core*
rm -f check_prim
#Pusty wiersz
cleancheck_prim_16:
rm -f *~
rm -f core*
rm -f check_prim_16
#Pusty wiersz
cleanall:
rm -f *~
6
rm -f primitive
rm -f check_prim
rm -f check_prim_16
rm -f primitive16
Proszę zwrócić uwagę, e
ż reguła all jest regułą pustą - w miejscu gdzie powinna być zdefiniowana jej akcja znajduje się pusty wiersz. Mimo tego jest to pierwsza regu a
ł i program make spróbuje ją wykona .
ć Aby mógł to zrobić musi być spe-
łniona lista wymagań, co pociągnie za sobą realizację wszystkich reguł wy-mienionych na tej liście. Akcje opisane wyra eniami ż
zawieraj cymi
ą
odwołania
do sta ej
ł
są odpowiednio rozwijane, np. akcja $(CC) $(OFLAGS) primitive primitive.c jest rozwijana do gcc -Wall -o primitive primitive.c. Niektóre regu y ł nie
są powi zane
ą
z regułą all (w przyk adzie
ł
służą do usuwania plików, które w
danej chwili nie są potrzebne). Wywołujemy je według schematu: make nazwa_regu y (np. make clean).
ł
Do usuwania błędów mo emy
ż
u y
ż ć debuggera gdb, aby się nim posłużyć musi-
my dodać flagę -g do wywołania kompilatora, a następnie wywo a ł ć polecenie:
gdb nazwa, gdzie nazwa oznacza nazwę pliku wykonywalnego. Debugger umo liwia
ż
procę w trybie interaktywnym. Oto lista najwa niejszych ż
instrukcji
dost pnych w tym programie:
ę
break – ustawia pu apk
ł
w wybranym wierszu programu np. break 6,
ę
clear – usuwa pu apk
ł
ę z określonego wiersza np. clear 6,
delete – usuwa wszystkie pułapki,
print – wypisuje warto
zmiennej, np. print liczba,
ść
step – wykonuje jeden wiersz programu,
next – jak wy ej, ale wchodzi do funkcji,
ż
run – uruchamia program, musi być wykonana przed step i next. Nale y ż
także pamiętać o ustawieniu pułapki w odpowiednim wierszu.
continue – kontynuuje wykonanie programu, po tym jak został on prze-rwany po napotkaniu pu apki.
ł
Zadania:
1. Uruchom program vimtutor i zapoznaj si z dzia ę
aniem edytora VIM.
ł
2. Napisz program typu „hello world” w j zyku C i skompiluj go. Usu ę
wszelkie
ń
ostrzeżenia pojawiające się podczas kompilacji.
7
3. Napisz w asny plik makefile i przetestuj dzia ł
anie polecenia make.
ł
4. Napisz program zawieraj cy prost
ą
funkcj
ą
i p
ę
tl
ę
„for”. Skompiluj go z opcj
ę
-g
ą
i prze led
ś
ź jego wykonanie za pomoc gdb (skorzystaj z pomocy w tym ą
programie, wydaj c polecenie help).
ą
8