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

Wprowadzenie

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

Oczywi cie

ś

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

#Pusty wiersz

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 core*

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