Linuksowy Poradnik Olimpiady Informatycznej 1 Wst¦p 2 Czytanie i

Transkrypt

Linuksowy Poradnik Olimpiady Informatycznej 1 Wst¦p 2 Czytanie i
Linuksowy Poradnik Olimpiady Informatycznej
Marek ›ylak
21 marca 2006
1
Wst¦p
nia katalogu domowego nale»¡cego do aktualnie
zalogowanego u»ytkownika.
Dokument ten powstaª m.in. na podstawie do-
Linuks jest systemem operacyjnym, w któ-
±wiadcze« studentów zdobytych podczas zawo-
rym wielu u»ytkowników mo»e pracowa¢ jedno-
dów programistycznych o charakterze algoryt-
cze±nie, dlatego ka»dy u»ytkownik posiada swój
micznym (ACM, MPPZ, MWPZ itp.). Opisuje
katalog domowy, który jest miejscem przecho-
on podstawy obsªugi Linuksa oraz sposoby na
wywania wszystkich plików zwi¡zanych z da-
wydajne rozwi¡zywanie zada« olimpijskich przy
nym u»ytkownikiem (dokumenty, pliki kongu-
pomocy standardowych narz¦dzi.
racyjne, e-maile itp.).
2
mo»esz dodatkowo dostosowa¢ do swoich po-
Je±li do kodowania wybraªe± tryb graczny,
Czytanie i analiza zadania
trzeb ustawienia terminala (wielko±¢ czcionki,
ukªad kolorów). W trybie tekstowym masz do-
Przeczytaj uwa»nie zadanie. Zaprojektuj algo-
st¦pnych kilka wirtualnych konsol, mi¦dzy któ-
rytm i struktury danych. Opcjonalnie sporz¡d¹
rymi mo»na przeª¡cza¢ si¦ przy pomocy kombi-
notatki na papierze. Najlepiej nie zabiera¢ si¦ za
nacji Alt-F1, Alt-F2, itd.
kodowanie, dopóki nie ma si¦ w gªowie peªnego
obrazu rozwi¡zania. Podczas kodowania trzeba
qsort).
nie wymy±laniu algorytmu.
Po otworzeniu terminala aktualny katalog
roboczy b¦dzie ustawiony na twój katalog do-
Kodowanie
mowy.
$ cd
trybu gracznego do tekstowego: Ctrl-Alt-F1)
xterma
lub
Sprawdzanie aktualnego katalogu roboczego od-
Konsol¦).
bywa si¦ przy pomocy polecenia
Na komputerach udost¦pnianych zawodnizasilania, domy±lnie uruchamia si¦ Linuks w trybie gracznym oraz menad»er okien KDE. W
Aby wypisa¢ zawarto±¢ katalogu trzeba u»y¢:
trybie gracznym zarz¡dzanym przez KDE pro-
$ ls
gramy okienkowe mo»na wybiera¢ z menu rozwijanego przyciskiem K umiejscowionym w le-
Je±li chcemy dodatkowo wypisa¢ rozmiary pli-
wym dolnym rogu ekranu, który peªni rol¦ podobn¡ jak przycisk Start w Windows.
kconsole,
ków sformatowane w postaci bardziej czytel-
Aby
nej dla czªowieka, nale»y u»y¢ polecenia
rozwijamy gªówne menu
opcjami
klikaj¡c w przycisk K, nast¦pnie rozwijamy
podmenu System i w ko«cu wybieramy Pro-
-l
oraz
-h:
ls
z
$ ls -lh
gram Terminala (Konsola).
Obok przycisku K znajduj¡ si¦ tak»e inne
przydatne przyciski.
pwd:
$ pwd
/home/contest
kom Olimpiady Informatycznej, po wª¡czeniu
uruchomi¢
Do katalogu domowego mo»na szybko
wróci¢ przy pomocy polecenia:
Zaloguj si¦ na konsol¦ tekstow¡ (przej±cie z
lub otwórz terminal graczny (np.
man
kªadowo dokumentacj¦ jakiej± funkcji (np.
si¦ koncentrowa¢ na poprawno±ci programu, a
3
Na jednej konsoli
mo»na mie¢ otwarty program, a na innej przy-
Szczegóªowe opisy wszystkich polece« Linukso-
Jednym z nich jest przy-
wych mo»na uzyska¢ przy pomocy polecenia
cisk Pliki osobiste, który sªu»y do przegl¡da-
w nast¦puj¡cy sposób:
1
man
$ man ls
administracji systemu, ni» na Olimpiadzie
Informatycznej
Po wywoªaniu opisu polecenia, nawigacja odbywa si¦ przy pomocy strzaªek oraz przycisków
PgUp i PgDown.
•
Wychodzi si¦ przez naci-
emacs jeszcze bardziej rozbudowany
ni» vim, ale troch¦ bardziej intuicyjny, te»
±ni¦cie q. Wyszukiwanie tekstu jest mo»liwe po
wymaga nauki z podr¦cznika, wspomaga
naci±ni¦ciu / (dziaªa te» w wielu innych pro-
debugowanie
gramach m.in. w Firefox). Je±li po znalezieniu
•
wzorca chcemy znale¹¢ kolejne jego wyst¡pienie
kwrite, kate standardowe edytory w
Czasami bardziej szczegó-
±rodowisku gracznym KDE, intuicyjne
ªowe informacje mo»na uzyska¢ dzi¦ki poleceniu
oraz zawieraj¡ce du»o opcji dost¦pnych
trzeba, nacisn¡¢ n.
info:
przez menu, polecane w trybie gracznym
$ info ls
jako alternatywa dla mcedit
Zaczynamy edycj¦ nowego pliku przy pomocy
Zalecane jest zapoznanie si¦ z mo»liwo±ciami
podstawowych polece« (info
coreutils).
polecenia:
Utwórz podkatalog w którym b¦dziesz trzy-
$ mcedit zad1.cpp
maª wszystkie pliki (¹ródªa, testy) dotycz¡ce
aktualnie rozwi¡zywanego zadania i przejd¹ do
nowo utworzonego katalogu:
4
$ mkdir zad1
$ cd zad1
Po zapisaniu programu i wyj±ciu z edytora przyst¦pujemy do kompilacji:
Bardzo po»yteczna funkcja linii polece« jest au-
$ c++ zad1.cpp
tomatyczne dopeªnianie. Je±li wpiszemy polecenie, którego argumentem jest nazwa pliku lub
Je±li kompilacja nie powiodªa si¦, analizujemy
katalogu, to cz¦sto argumentu nie trzeba wpisy-
wypisane przez kompilator informacje o bª¦dach
wa¢ do ko«ca. Wystarczy wpisa¢ jego pierwsze
i wracamy do edytora aby poprawi¢ program.
litery, a potem nacisn¡¢ Tab. Je±li jest tylko je-
W przeciwnym wypadku powstanie plik wyko-
den plik lub katalog, którego nazwa zaczyna si¦
nywalny
od podanych znaków, argument zostanie od razu
ranowany sposób:
mo»liwo±ci, zostan¡ one wypisane na ekranie i
$ c++ -Wall -Wshadow -o zad1 zad1.cpp
trzeba wtedy poda¢ kolejne znaki argumentu.
Wi¦cej informacji o interpreterze linii polece«
Opcja
man bash.
Rozpocznij edycj¦ pliku z rozwi¡zaniem. Do
wª¡cza dodatkowe ostrze»enia po-
natomiast opcja
-Wshadow
nakazuje kompilato-
rowi wykrywanie przypadków przykrycia w pro-
skªadni. Najcz¦±ciej u»ywane edytory to:
gramie jednych zmiennych przez inne zmienne o
mcedit intuicyjny, obsªuga jak w edy-
tej samej nazwie. Opcja
torach u»ywanych pod Windows, mo»na
-o ustawia nazw¦ pliku
wykonywalnego.
u»ywa¢ bez wiedzy wst¦pnej, poniewa» za-
Je±li chcemy skompilowa¢ program z dodat-
wsze wy±wietla na ekranie informacje na
kowymi optymalizacjami kodu maszynowego,
temat swoich funkcji i skrótów klawiszo-
mo»na u»y¢ polecenia:
wych, zupeªnie wystarczaj¡cy na Olimpia-
$ c++ -Wall -Wshadow -O2 \
-fomit-frame-pointer -o zad1 zad1.cpp
dzie Informatycznej
•
-Wall
magaj¡ce wykrywa¢ bª¦dy na etapie kompilacji,
edycji najlepiej u»ywa¢ edytora z kolorowaniem
•
a.out.
Mo»na skompilowa¢ program w bardziej wy-
dopeªniony do tej wªa±nie nazwy! Je±li jest kilka
mo»na uzyska¢ po wywoªaniu
Kompilacja
vim nieintuicyjny interfejs,
obsªugi
trzeba uczy¢ si¦ z instrukcji i ¢wiczy¢ kilka
Je±li chcemy podzieli¢ dªugie polecenie na kilka
dni zanim nabierze si¦ wprawy, umo»liwia
linii to umieszczamy znak
wykonanie skomplikowanych operacji przy
nii, oprócz ostatniej.
\
na ko«cu ka»dej li-
pomocy kilku przyci±ni¦¢ klawiatury, bar-
W tym miejscu warto powiedzie¢, »e ko-
dzo du»o opcji, wbudowany j¦zyk skryp-
lejnym udogodnieniem Linuksowej linii polece«
towy, jego zalety doceni¢ mo»na raczej do-
jest mo»liwo±¢ szybkiego przywoªania wcze±niej
piero przy pisaniu du»ej ilo±ci programów i
wykonanych polece« przy pomocy wciskania na
2
klawiaturze strzaªki w gór¦.
Przywoªane pole-
Taki sam efekt jaki daje ostatnie polecenie,
cenie mo»na przed u»yciem dodatkowo zmody-
mo»na uzyska¢ przy pomocy mechanizmu wzor-
kowa¢.
ców:
5
$ ls *x* | wc -l
Testowanie
Je±li w argumencie u»yjemy znaku
zad1
Skompilowany plik wykonywalny
*,
to jest on
rozwijany do listy plików w aktualnym katalogu,
urucha-
których nazw¦ da si¦ uzyska¢ przez zast¡pienie
mia si¦ w nast¦puj¡cy sposób:
ka»dej
*
we wzorcu przez pewien ci¡g znaków.
Mo»na tak»e uruchomi¢ program podaj¡c
$ ./zad1
mu na wej±ciu zawarto±¢ jakiego± pliku:
$ cat in | ./zad1
Je±li nasz program próbuje co± czyta¢ ze standardowego wej±cia, zatrzyma si¦ w oczekiwaniu
Jeszcze krócej mo»na to zrobi¢ w taki sposób:
na dane zaraz po uruchomieniu. Mo»na wtedy
$ ./zad1 < in
po prostu r¦cznie wpisa¢ odpowiednie dane. Koniec pliku uzyskuje si¦ przez naci±ni¦cie Ctrl-D.
Taki zapis powoduje, »e nie s¡ uruchamiane
Gdy chcemy bezzwªocznie zako«czy¢ aktual-
»adne dodatkowe programy i standardowe wej-
nie wykonywany program, u»ywamy kombinacji
±cie naszego programu jest poª¡czone bezpo±red-
Ctrl-C. Je±li proces wyª¡czyª mo»liwo±¢ zako«-
nio z danym plikiem.
czenia w taki sposób, trzeba uzyska¢ dost¦p do
Wiemy ju» du»o o sterowaniu wej±ciem, ale
innego terminala, znale¹¢ numer procesu przy
pomocy polecenia
ps
lub
ps aux
nie zajmowali±my si¦ do tej pory wyj±ciem pro-
(druga wersja
gramu. Normalnie program wypisuje wszystkie
daje wi¦cej informacji) i zako«czy¢ proces pole-
dane na ekran. Je±li wypisaª wi¦cej linii ni» po-
ceniem:
siada nasz terminal, dane, które zd¡»yªy uciec
$ kill -9 numer_procesu
przez górn¡ kraw¦d¹ terminala, mo»na dzi¦ki
Najcz¦±ciej mo»na zako«czy¢ proces du»o pro-
dane wypisywane przez program do pliku (w
±ciej:
naszym przypadku do
kombinacji Shift-PgUp.
aby móc si¦ im do-
przetwarza¢:
$ ./zad1 < in > out
To zako«czy wszystkie procesu u»ytkownika,
których pliki binarne miaªy nazw¦ mc (mc -
Je±li nie chcemy kasowa¢ zawarto±ci pliku
Midnight Commander to bardzo intuicyjny, najNatomiast polecenie
out
tylko dopisa¢ dane na ko«cu, musimy u»y¢ in-
cz¦±ciej u»ywany tekstowy menad»er plików w
nego operatora przekierowania wyj±cia:
killall mc
$ ./zad1 < in >> out
jest równowa»ne z prób¡ zako«czenia wszystkich
procesów u»ytkownika o nazwie
out),
kªadniej przyjrze¢ w edytorze i ewentualnie dalej
$ killall -9 mc
Linuksie).
Mo»emy te» zapisa¢
mc przy pomocy
Mo»na te» zapisa¢ dodatkowo do pliku standar-
kombinacji Ctrl-C.
dowe wyj±cie diagnostyczne programu (stderr):
Je±li dane dla naszego programu zajmuj¡
tylko jedn¡ linijk¦, mo»na je poda¢ tak»e w taki
$ ./zad1 < in > out 2> err
sposób:
Je±li chcemy mierzy¢ wydajno±¢ programu, na
$ echo "1 2 3 4" | ./zad1
pewno wa»na jest mo»liwo±¢ mierzenia czasu
U»yªem tu jednej z najprzydatniejszych funk-
$ time ./zad1 < in > out
jego wykonania:
cji linii polece«, czyli potoków. Je±li napiszemy
kilka polece« oddzielonych znakami
|
Po
to stan-
dardowe wyj±cie pierwszego polecenia zostanie
szych danych.
poª¡czone ze standardowym wej±ciem drugiego
polecenia itd.
Czyli je±li chcemy np.
maªych
testów
poprawno±cio-
Przydaj¡ si¦ wtedy ró»ne gene-
ratory testów.
policzy¢
ile jest w aktualnym katalogu plików z liter¡
wykonaniu
wych warto te» przetestowa¢ program na wi¦k-
x
Podczas testowania, szczególnie kiedy powstaj¡ du»e pliki wynikowe, czasami pojawia si¦
w nazwie, piszemy:
konieczno±¢ porównania dwóch plików. Mo»na
$ ls | grep x | wc -l
to zrobi¢ przy pomocy polecenia
3
cmp:
$ cmp plik1 plik2
$ c++ -g -o zad1 zad1.cpp
Je±li chcemy dosta¢ dokªadniejsze dane o tym,
Przy pomocy
w których miejscach pliki ró»ni¡ si¦, lepiej jest
gdb
mo»na te» debugowa¢ odpo-
wiednio skompilowane programy w Pascalu:
u»y¢:
$ diff plik1 plik2
$ fpc -g zad1.pas
Je±li podczas testowania okazaªo si¦, »e pro-
gdb i ªadujemy nasz plik binarny:
Uruchamiamy
gram nie dziaªa zgodnie z naszymi oczekiwaniami, trzeba jak najszybciej znale¹¢ i poprawi¢
$ gdb zad1
bª¡d. S¡ dwie szkoªy debugowania.
Pierwsza metoda nie potrzebuje debugera i
Po uruchomieniu
polega modykowaniu programu w celu znale-
gdb
znajdziemy si¦ w linii po-
lece« debugera. Mo»emy od razu przegl¡da¢ kod
zienia bª¦dów, a dokªadniej, dodawaniu instruk-
programu przy pomocy polecenia
cji które sprawdzaj¡ poprawno±¢ oblicze« i spój-
skrócie
no±¢ struktur danych oraz wypisuj¡ dodatkowe
l.
list
lub w
Je±li chcemy zobaczy¢ fragment pro-
gramu otaczaj¡cy wybran¡ lini¦ wystarczy wpi-
informacje o tym co dzieje si¦ w trakcie oblicze«.
sa¢:
Mo»na np. doda¢ instrukcje, które b¦d¡ wypisywa¢ stan wybranych zmiennych, w wybra-
(gdb) l N
nych momentach wykonania programu:
int a[3][3],x;
(...)
printf("x=%d\n",x);
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
program wykona si¦ do ko«ca zatrzymuj¡c si¦
Mo»na te» doda¢ kod, który b¦dzie testowaª, czy
tylko w oczekiwaniu na dane. Przy uruchamia-
zmienne i struktury danych speªniaj¡ okre±lone
niu mo»na od razu przekierowa¢ zawarto±¢ do-
warunki i wypisywaª komunikaty je±li co± idzie
wolnego pliku na standardowe wej±cie naszego
nie tak:
programu:
gdzie
te»
to
assert.h:
zrobi¢
z
u»yciem
Mo»emy tak»e
(gdb) l nazwa_funkcji
Aby wystartowa¢ nasz program, trzeba u»y¢ polecenia
if (x<0) {
printf("bª¡d: x=%d\n",x);
exit(1);
}
Mo»na
N to numer linii programu.
wy±wietli¢ tre±¢ dowolnej funkcji:
run
(lub
r).
Bez dodatkowych ustawie«
(gdb) r < in
Je±li chcemy mie¢ mo»liwo±¢ wykonywania programu linijka po linijce, konieczne jest ustawienie tzw. punktów zatrzymania (breakpoint ).
biblioteki
Aby ustawi¢ punkt zatrzymania trzeba u»y¢ polecenia
#include <assert.h>
(...)
assert(x>=0);
break
lub w skrócie
b:
(gdb) b N
W tym przypadku, je±li warunek nie zosta-
Mo»na ustawi¢ kilka punktów zatrzymania, nie
nie speªniony, program zatrzyma si¦ i wypisze
tylko zwi¡zanych z konkretnych liniami pro-
numer linijki w której asercja nie zostaªa speª-
gramu,
niona.
funkcji:
Druga metoda debugowania wymaga u»ycia
debugera.
(gdb) b moja_funkcja
Standardowym debugerem pod Li-
nuksem jest
gdb.
Je±li zamierzamy u»ywa¢
ale tak»e z wywoªaniami wybranych
gdb,
kod binarny naszego programu musi zawiera¢
Je±li chcemy zatrzyma¢ nasz program od razu
dodatkowe informacje. Odpowiedni kod binarny
po uruchomieniu, piszemy:
uzyskuje si¦ przez przekompilowanie programu
z opcj¡
-g:
(gdb) b main
4
To samo dotyczy programów w Pascalu.
W
Po ustawieniu punktów zatrzymania, uru-
Makefile mo»na doda¢ te» funkcje odpo-
wiedzialne za testowanie:
chamiamy nasz program i czekamy na jego zatrzymania, na ekranie zostanie wy±wietlona li-
t: zad1
time ./zad1 < in | tee out
nia, która ma by¢ za chwil¦ wykonana. Aby j¡
Teraz mo»emy wywoªa¢ polecenie:
trzymanie.
Je±li zatrzymaª si¦ na punkcie za-
wykona¢ i przej±¢ do kolejnej linii, u»ywamy po-
next
lecenia
(albo
n).
$ make t
Aby powtórzy¢ ostatnio
wykonane polecenie nie musimy go wpisywa¢.
Wystarczy wcisn¡¢ Enter.
Wywoªanie takiego polecenia uaktualnia w razie
Debuger powtórzy
potrzeby kod binarny naszego programu, a po-
wtedy ostatnio u»yte polecenie.
tem wykonuje go podaj¡c na wej±ciu zawarto±¢
W celu kontynuacji do kolejnego punktu zatrzymania, u»ywamy polecenia
c).
continue
pliku
(lub
out
step
s).
(lub
preterze linii polece«
u»y¢ polecenia
zautomatyzowa¢
bash.
Po napisaniu po-
kie pliki w aktualnym katalogu roboczym, których nazwy ko«cz¡ si¦ znakami
da¢ aktualne warto±ci zmiennych, w tym tablic
print
tak»e
ni»szego polecenia zostan¡ znalezione wszyst-
W trybie pracy krok po kroku mo»na ogl¡i napisów.
mo»na
wykorzystuj¡c elementy programowania inter-
ªanie funkcji i chcemy prze±ledzi¢ dokªadnie to
next
i zapisuj¡c wyj±cie programu do pliku
Testowanie
Gdy w linii, która ma si¦ wykona¢ jest wywowywoªanie, trzeba zamiast
in
oraz na ekran.
.in.
Nast¦pnie
nasz program zostanie wykonany kilka razy, za
Robi si¦ to przy pomocy polecenia
ka»dym razem dostaj¡c na wej±ciu kolejny plik.
(lub p):
Wyniki wykona« programu znajd¡ si¦ w plikach
(gdb) p x
o nazwach takich jakie miaªy pliki wej±ciowe,
tylko z rozszerzeniami zmienionymi z
Dodatkowo mo»na ustawia¢ punkty obserwa-
.out:
.in
na
cyjne (watchpoint ), przy pomocy polecenia
watch (lub w). Powoduj¡ one wypisanie stosow- $ for f in *.in; do \
nej informacji przy ka»dej zmianie obserwowa- ./zad1 < $f > `basename $f .in`.out \
|| echo "Bª¡d: $f"; done
nej zmiennej. Da si¦ nawet zmienia¢ warto±ci
zmiennych i wywoªywa¢ funkcje (polecenia set
Wi¦ksze polecenia warto zapisa¢ sobie w plikach
i call)!
(skryptach):
Wi¦cej informacji o mo»liwo±ciach gdb
mo»na uzyska¢ po wej±ciu do tego programu i #!/bin/bash
wpisaniu polecenia help.
for f in *.in
do
./zad1 < $f > `basename $f .in`.out \
6 Automatyzacja pracy
|| echo "Bª¡d: $f"
done
W pierwszej kolejno±ci warto usprawni¢ kompilacj¦. Podstawowa metoda polega na utworze-
Po utworzeniu skryptu trzeba mu jeszcze nada¢
niu odpowiedniego pliku
uprawnienie do wykonania:
Makefile:
all: zad1
zad1: zad1.cpp
c++ -g -Wall -Wshadow \
-o zad1 zad1.cpp
$ chmod +x testy
Tak przygotowany skrypt jest gotowy do u»ycia:
$ ./testy
Stworzony plik jest u»ywany przez program
make,
W skryptach mo»na te» u»ywa¢ p¦tli w stylu
który sªu»y do automatyzacji procesu
j¦zyka C:
kompilacji. Wystarczy teraz wpisa¢:
#!/bin/bash
for ((i=0;i<10;i++))
do
echo $i | ./zad1
done
$ make
Program
make
sprawdzi, czy kod binarny jest
aktualny w stosunku do kodu ¹ródªowego. Je±li
nie jest aktualny, przekompiluje program.
5
bc.
Linuksowej linii polece« mo»na tak»e u»ywa¢
±ciach.
jako prostego kalkulatora:
zwala on na obliczenia na liczbach caªkowitych o
Chodzi mianowicie o program
Po-
dziesi¡tkach tysi¦cy cyfr oraz konwersj¦ mi¦dzy
$ echo $((2+(3*7)))
23
systemami liczbowymi o ró»nych podstawach.
Oto przykªadowe u»ycie
bc:
$ echo "2^100" | bc
1267650600228229401496703205376
W wi¦kszo±ci dystrybucji Linuksa standardowo
jest dost¦pny kalkulator o sporych mo»liwo-
6